显示第二列不超过 4 个单词的行

显示第二列不超过 4 个单词的行

我有一个以下形式的符号表

M07UP49A0870I422.wav    <s> haraa keelaa <bn> </s>
M07UP49A0870I423.wav    <s> <horn> jau <babble>  </s>
M07UP49A0861C86105.wav  <s> waa khaada aadi kaa upayoga laabhadaayaka paaya gayaa hai  </s>
M07UP49A0861C86106.wav  <s> aadi kisaan apnee stara para bhii taiyaara kara sakatee hai </s>
M07UP49A0861C86107.wav  <s> kii gobara kaa upayoga kandxee banaakara iindhana kee ruupa mee kiyaa jaata hai <bang> </s>
M07UP49A0861C86108.wav  <s> geehuun kii phasala kii katxaayii kee baada <horn> kheeto ko aaga lagaakara saapha kiyaa jaata hai <babble> </s>
M07UP49A0861C86109.wav  <s> badxqii maatraa mee jiiwaanqu jalakara nashtxa ho jaataa hai <babble> </s>

显然,该文件包含两列。第一列是音频文件的名称(扩展名为 .wav),第二列是音频文件的转录内容

第二列应该由不超过4个单词组成(不包括标签;标签是写在<>中的单词)。

例如,考虑第二行。这一行只有一个单词,即(注意

<s> 
</s> 
<babble> 
<horn> 

不包含在该行的字数统计中,因为它们是标签)。

本质上,在任何行中,第二列中的单词都是不被 <> 包围的字符串。

现在我的工作是只找出第二列中单词数不超过 4 个的行。

我使用了以下命令,

gawk 'NF>4' file > output

但没有得到结果。

为了您的方便,这是预期的输出

M07UP49A0870I422.wav    <s> haraa keelaa <bn> </s>
M07UP49A0870I423.wav    <s> <horn> jau <babble>  </s>

我得到以下输出,因为第二列仅包含两个单词,即 haraa 和 keelaa,第二行仅包含一个单词,即 jau。

除了这些行之外,第二列中的行由超过 4 个单词组成。

答案1

以下 AWK 脚本将原始行保存在 x 中,删除所有标签,然后计算单词数(负 1 以减少第一个字段中的文件名)。如果字数小于 5,则打印原始行:

awk '{x=$0; gsub(/<[^>]*>/, "")} NF-1<5 {print x}' filename

答案2

可以使用一个小的 python 脚本来完成:

#!/usr/bin/env python3
import sys

for l in open(sys.argv[1]).readlines():
    l = l.strip()
    print(l) if len([s for s in l.split("<s>")[-1].split()
             if not all([s.startswith("<"), s.endswith(">")])]) <= 4 else ("")

假设您已经python3安装:

  • 将其复制到一个空文件中,另存为get_colls.py
  • 使用文件作为参数运行它:

    python3 /path/to/get_colls.py <file>
    

示例的输出:

M07UP49A0870I422.wav    <s> haraa keelaa <bn> </s>
M07UP49A0870I423.wav    <s> <horn> jau <babble>  </s>

解释

剧本:

  • 按分隔符分割行<s>
  • 在第二部分中,计算字符串的数量,不是开始于<并结束于>
  • <=打印出长度为4 的行

答案3

使用 awk可能是这里最好的,因为它可以让你清楚地表达你的想法(去掉标签,最多只能剩下 4 个单词,不包括第一列)。但您也可以使用 grep 来完成此操作,因为这只是过滤行的问题,并且过滤器可以通过正则表达式来描述。

grep -vE '^ *[^ ]+((<[^>]*>| )+[^<> ]+){5}'
  • -v: 排除匹配行
  • -E:使用扩展正则表达式语法
  • ^ *[^ ]+匹配行开头的第一个单词
  • (…){5}表示括号中的 5 个或更多内容
  • (<[^>]*>| )+匹配空格和标签的非空序列
  • [^<> ]+匹配非标签词

答案4

这个命令应该有效:

awk -F "wav" '{print $2}' file | awk '{gsub("<[^>]*>", "")}1' | awk 'NF<4'

相关内容