首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash -每行字/词频率(即文档)

Bash -每行字/词频率(即文档)
EN

Stack Overflow用户
提问于 2016-10-10 19:49:13
回答 2查看 126关注 0票数 0

我有一个像这样的文件rev.txt

代码语言:javascript
复制
header1,header2
1, some text here
2, some more text here
3, text and more text here

我还有一个词汇表文档,其中包含来自rev.txt的所有惟一单词,类似于这样(但排序):

代码语言:javascript
复制
a
word
list
text
here
some
more
and

我想为rev.txt中的每一行生成一个词频表,其中列出了rev.txt每一行中每个词汇表的出现情况,如下所示:

代码语言:javascript
复制
0 0 0 1 1 1 0 0     
0 0 0 1 1 1 1 0 
0 0 0 2 1 0 1 1

它们也可以是逗号分隔的。

这与a question here类似。但是,我不想搜索整个文档,而是使用我已经拥有的完整词汇表逐行进行搜索。

Re: Jean-Fran ois Fabre

实际上,我正在MATLAB中执行这些操作。但是,bash (我相信)对于这个预处理来说会更快,因为我有直接的磁盘访问文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-10 21:26:57

通常,我会使用python,但是仅限于使用bash,这个hacky单行解决方案将适用于给定的测试用例。

perl -pe 's|^.*?,[ ]?(.*)|\1|' rev.txt | sed '1d' | awk -F' ' 'FILENAME=="wordlist.txt" {wc[$1]=0; wl[wllen++]=$1; next}; {for(i=1; i<=NF; i++){wc[$i]++}; for(i=0; i<wllen; i++){print wc[wl[i]]" "; wc[wl[i]]=0; if(i+1==wllen){print "\n"} }}' ORS="" wordlist.txt -

解释/我的想法。

在第一部分中,perl -pe 's|^.*?,[ ]?(.*)|\1|' rev.txt被用来从"rev.txt“中取出第一个逗号之后的所有内容(+删除前面的空格)。

在下一部分中,使用sed '1d'删除第一个即标题行。

在下一部分中,我们指定awk -F' ' ... ORS="" wordlist.txt -使用空格作为字段分隔符,输出记录分隔符为无空格(注:我们将在进行时打印它们),并读取来自wordlist.txt (即“包含来自rev.txt的所有唯一单词的词汇表文档”)和stdin的输入。

在awk命令中,如果文件名等于" wordlist.txt ",那么(1)初始化数组wc,其中键是单词,计数为0;(2)初始化一个列表wl,其中单词顺序与wordlist.txt相同。

代码语言:javascript
复制
FILENAME=="wordlist.txt" {
  wc[$1]=0;
  wl[wllen++]=$1;
  next
};

初始化后,对于stdin行中的每个单词(即整洁的rev.txt),增加wc中单词的计数。

代码语言:javascript
复制
{ for (i=1; i<=NF; i++) {
    wc[$i]++
    }; 

在为一行添加单词计数后,对于单词列表中的每个单词wl,用空格打印该单词的计数,并将wc中的计数重新设置为0。如果单词是列表中的最后一个,那么在输出中添加一个空格。

代码语言:javascript
复制
  for (i=0; i<wllen; i++) {
    print wc[wl[i]]" ";
    wc[wl[i]]=0;

    if(i+1==wllen){
      print "\n"
      } 
    }
  }

总的来说,这应该会产生指定的输出。

票数 1
EN

Stack Overflow用户

发布于 2016-10-11 08:17:59

这是一个在awk。它读取词汇表文件voc.txt (在awk中自动生成它是小菜一碟),复制每行文本的单词列表并计算单词频率:

代码语言:javascript
复制
$ cat program.awk
BEGIN {
    PROCINFO["sorted_in"]="@ind_str_asc"  # order for copying vocabulary array w
}
NR==FNR {                                 # store the voc.txt to w
    w[$1]=0
    next
}

FNR>1 {                                   # process text files to matrix
    for(i in w)                           # copy voc array
        a[i]=0
    for(i=2; i<=NF; i++)                  # count freqs
        a[$i]++
    for(i in a)                           # output matrix row
        printf "%s%s", a[i], OFS
    print ""
}

运行它:

代码语言:javascript
复制
$ awk -f program.awk voc.txt rev.txt
0 0 1 0 0 1 1 0
0 0 1 0 1 1 1 0
0 1 1 0 1 0 2 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39965706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档