我有一个以下形式的符号表
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'