2011-02-01 105 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