Bash 将制表符分隔符添加到Grep

Bash 将制表符分隔符添加到Grep,bash,awk,cygwin,grep,Bash,Awk,Cygwin,Grep,我不熟悉grep和awk,我想在“frequency.txt”文件输出中创建制表符分隔的值(该脚本查看一个大型语料库,然后输出每个单词以及在语料库中使用的次数-我为高棉语修改了它)。我环顾了一下(),但似乎找不到一个对这个bash脚本有意义的例子(我太新手了) 我在cygwin中使用此bash脚本: #!/bin/bash # Create a tally of all the words in the corpus. # echo Creating tally of word frequenc

我不熟悉grep和awk,我想在“frequency.txt”文件输出中创建制表符分隔的值(该脚本查看一个大型语料库,然后输出每个单词以及在语料库中使用的次数-我为高棉语修改了它)。我环顾了一下(),但似乎找不到一个对这个bash脚本有意义的例子(我太新手了)

我在cygwin中使用此bash脚本:

#!/bin/bash
# Create a tally of all the words in the corpus.
#
echo Creating tally of word frequencies...
#
sed -e 's/[a-zA-Z]//g' -e 's/​/ /g' -e 's/\t/ /g' \
    -e 's/[«|»|:|;|.|,|(|)|-|?|។|”|“]//g' -e 's/[0-9]//g' \
    -e 's/ /\n/g' -e 's/០//g' -e 's/១//g' -e 's/២//g' \
    -e 's/៣//g' -e 's/៤//g' -e 's/៥//g' -e 's/៦//g' \
    -e 's/៧//g' -e 's/៨//g' -e 's/៩//g' dictionary.txt | \
  tr [:upper:] [:lower:] | \
  sort | \
  uniq -c | \
  sort -rn > frequency.txt
grep -Fwf dictionary.txt frequency.txt | awk '{print $2 "," $1}'
Awk使用逗号打印,但这只是在屏幕上。如何在频率和术语之间放置制表符(逗号也可以)

这里是dictionary.txt文件的一小部分(高棉语不使用空格,但在本语料库中,每个单词之间有一个不间断的空格,使用sed和正则表达式转换为空格):

ព្រះ​វិញ្ញាណ​នឹង​ប្រពន្ធ​ថ្មោង​ថ្មី​ពោល​ថា អញ្ជើញ​មក ហើយ​អ្នក​ណា​ដែល​ឮ​ក៏​ថា អញ្ជើញ​មក​ដែរ អ្នក​ណា​ដែល​ស្រេក នោះ​មាន​តែ​មក ហើយ​អ្នក​ណា​ដែល​ចង់​បាន មាន​តែ​យក​ទឹក​ជីវិត​នោះ​ចុះ ឥត​ចេញ​ថ្លៃ​ទេ។

下面是frequency.txt的输出示例,与现在一样(频率和术语):

25605នឹង 25043ជា 22004បាន 20515នោះ

我希望输出frequency.txt如下所示(其中TAB是实际的TAB字符):

25605TABនឹង 25043标签ជា 22004TABបាន 20515标签នោះ


谢谢你的帮助

用“将awk写入文件怎么样?您应该能够用以下命令替换整个冗长的
sed
命令:

tr -d '[a-zA-Z][0-9]«»:;.,()-?។”“|០១២៣៤៥៦៧៨៩'
tr '\t' ' '
评论:

  • 's/​/ /g'
    -前两个斜杠表示重新使用以前的匹配项,即
    [a-z][a-z]
    ,并将其替换为空格,但它们已被删除,因此这是不可操作的
  • 的/[«|»|:| | |.|,|(|)|-||។|”|“]//g'
    -管道字符不在方括号内分隔备选字符,它们是文字字符(多个字符是冗余的),等效字符是
    的/[«»:;,()-?”?។”“|]//g'
    (保留一根管道,以防确实要删除它们)
  • 's//\n/g'
    -之前,您将制表符替换为空格,现在将空格替换为换行符
您应该能够通过在
uniq
之后的管道中插入该选项卡来获得所需的选项卡:

sed 's/^ *\([0-9]\+\) /\1\t/'
如果希望AWK命令输出选项卡:

awk 'BEGIN{OFS='\t'} {print $2, $1}'

下面的脚本应该可以帮助您找到需要的地方。到
tee
的管道将让您在屏幕上看到输出,同时将输出写入
/outfile

#!/bin/sh  

sed ':a;N;s/[a-zA-Z0-9។០១២៣៤៥៦៧៨៩\n«»:;.,()?”“-]//g;ta' < dictionary.txt | \
gawk '{$0=toupper($0);for(i=1;i<=NF;i++)a[$i]++}
   END{for(item in a)printf "%s\t%d ", item, a[item]}' | \
tee ./outfile
<代码>#!/bin/sh sed':a;N;s/[a-zA-Z0-9។០១២៣៤៥៦៧៨៩\n«»:;,()?“”-][/g;ta'gawk'{$0=toupper($0);用于(i=1;如果你提供一个语料库文件
dictionary.txt
的样本会更好,因为我几乎可以肯定你可以用一次调用
awk
来替换整个脚本。也就是说,
tr、sort、uniq、sed或grep都没有用。我在原始的q中添加了一个字典文本文件的样本uestion-谢谢!@Nathan字典文件使用的是什么编码?它在我的屏幕上看起来像垃圾:看@SiegeX它是UTF-8格式的-高棉Unicode还没有很多东西支持。@Nathan是
dictionary.txt
仅仅是一堆单词,可能一行中有一个以上的单词被空格隔开?还是一个单词列表,一个单词每行?是的,这确实有效,但并不理想,因为现在屏幕上没有任何正在发生的事情的状态(除了我的cpu监视器,我不知道它正在工作)。还有其他方法吗?谢谢你-至少是可能的。谢谢你Dennis。当我添加sed的s/^*([0-9]\+)时,正如你所说,我在添加选项卡时遇到了麻烦/\1\t/'在uniq之后,脚本在末尾停止,并且永远不会填充我的frequency.txt。我是否理解正确,我只是在uniq下面添加了sed的/^*([0-9]\+)/\1\t/'一行?@Nathan:是的,你需要添加必要的管道字符。就像你现在有
uniq-c \\\`一样,你需要
sed…\`(实际上不需要行延续反斜杠,因为管道会为您进行行延续)。谢谢Dennis,我从未使用过bash脚本,所以我对语法不太熟悉。谢谢您花时间帮助我!