bash - 将制表符分隔符添加到 Grep

标签 bash awk cygwin grep

我是 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/

相关文章:

macos - Bash 变量字符替换以空字符串或无效命令结束

awk - 根据内部文本匹配重命名文件 - 保留文件的所有内容

bash - 替换匹配两个模式的行

cygwin - 如何设置cygwin根目录?

bash - 解析系统日志以计算特定值

bash - 获取 curl http 代码

bash - 从 bash 打开然后杀死子进程

regex - 如何显示从文件开头到首次出现正则表达式的数据?

Bash - 解压缩 : command not found

c++ - CMake 在我的主机中找不到用于交叉编译器的 boost 库,但在 Raspberry Pi 中找到了