2011-02-01 79 views
3

我是grep和awk的新手,我想在“frequency.txt”文件输出中创建制表符分隔值(此脚本查看大型语料库,然后输出每个单词以及如何输出很多时候它在语料库中使用 - 我修改它为高棉语)。我环顾了一下(grep a tab in UNIX),但我似乎无法找到一个对我来说这个bash脚本很有意义的例子(我太多了新手)。将标签分隔符添加到Grep

我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是实际制表符):

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

感谢您的帮助!

+1

这将是更好,如果你提供什么样的语料库文件`dictionary.txt`样子,因为样本我几乎可以肯定你可以用`awk`来替换你的整个脚本。即不会使用`tr,sort,uniq,sed或grep` – SiegeX 2011-02-01 00:33:58

+0

我在原始问题中添加了字典文本文件的示例 - 谢谢! – Nathan 2011-02-01 00:43:42

+1

@Nathan字典文件使用什么编码?它看起来像我的屏幕上的垃圾:请参阅http://i.imgur.com/Ao82s.png – SiegeX 2011-02-01 00:48:21

回答

3

您应该能够更换整个漫长的sed命令与此:

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

评论:

  • 's/​/ /g' - 第一两条斜线的意思是重新使用以前的比赛这是[a-z][A-Z]和用空格代替,但他们被删除了,所以这是一个无操作
  • 's/[«|»|:|;|.|,|(|)|-|?|។|”|“]//g' - 管道字符不分隔布拉奇广场里面的替代品Kets,它们是字面的(并且多于一个是多余的),相当于's/[«»:;.,()-?។”“|]//g'(如果你真的想删除它们,只留下一个管道)
  • 's/ /\n/g' - 之前,你用空格替换了标签,现在你要替换用换行的空间

您应该能够通过uniq之后插入这个在您的管道有你想要的标签:

sed 's/^ *\([0-9]\+\) /\1\t/' 

如果你想在AWK命令输出标签:

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

写“awk”以“<”文件怎么样?

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