Bash 将制表符分隔符添加到Grep
我不熟悉grep和awk,我想在“frequency.txt”文件输出中创建制表符分隔的值(该脚本查看一个大型语料库,然后输出每个单词以及在语料库中使用的次数-我为高棉语修改了它)。我环顾了一下(),但似乎找不到一个对这个bash脚本有意义的例子(我太新手了) 我在cygwin中使用此bash脚本: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
#!/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'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脚本,所以我对语法不太熟悉。谢谢您花时间帮助我!