我是 grep 和 awk 的新手,我想在“frequency.txt”文件输出中创建制表符分隔值(此脚本查看大型语料库,然后输出每个单词及其使用次数在语料库中——我针对高棉语修改了它)。我环顾四周 ( grep a tab in UNIX ),但我似乎找不到一个对我来说对这个 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 是一个实际的制表符):
25605TABនឹង 25043TABជា 22004TABបាន 20515TABនោះ
感谢您的帮助!
最佳答案
你应该能够用这个替换整个冗长的 sed
命令:
tr -d '[a-zA-Z][0-9]«»:;.,()-?។”“|០១២៣៤៥៦៧៨៩'
tr '\t' ' '
评论:
's///g'
- 前两个斜杠表示重新使用之前的匹配项[a-z][A-Z]
并将它们替换为空格,但它们已被删除,因此这是一个空操作's/[«|»|:|;|.|,|(|)|-|?|។|”|“]//g'
- 竖线字符不t 在方括号内分隔备选方案,它们是文字(超过一个是多余的),等价于's/[«»:;.,()-?។”“|]//g'
(留下一个管道以防你真的想删除它们)'s//\n/g'
- 之前,您将制表符替换为空格,现在您将空格替换为换行符
通过在 uniq
之后立即将其插入您的管道中,您应该能够获得所需的选项卡:
sed 's/^ *\([0-9]\+\) /\1\t/'
如果你想让 AWK 命令输出一个制表符:
awk 'BEGIN{OFS='\t'} {print $2, $1}'
关于bash - 将制表符分隔符添加到 Grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4857598/