
次の形式のシンボルテーブルがあります。
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>
明らかに、ファイルには2つの列が含まれています。最初の列はオーディオファイル名(拡張子.wav)、2番目の列はオーディオファイルの録音内容です。
2番目の列は4単語以下で構成する必要があります(タグを除く、タグは<>で書かれた単語です)。
たとえば、2番目の行を見てみましょう。この行には1つの単語しかありません。集中する(知っている
<s>
</s>
<babble>
<horn>
タグなので、行の単語数には含まれません。
デフォルトでは、すべての行の2番目の列の単語は<>で囲まれていない文字列です。
今私の使命は、2番目の列で4単語以下の行のみを見つけることです。
私は次のコマンドを使用しました。
gawk 'NF>4' file > output
しかし、結果は得られませんでした。
あなたの便宜のために予想される結果は次のとおりです。
M07UP49A0870I422.wav <s> haraa keelaa <bn> </s>
M07UP49A0870I423.wav <s> <horn> jau <babble> </s>
2 番目の列には haraa と keelaa という 2 つの単語のみが含まれ、2 番目の行に jau という 1 つの単語しか含まれていないため、次の出力が表示されます。
この行に加えて、2番目の列の行は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>
- 2番目の部分では、文字列の数を数え、いいえで始まり、
<
で終わる>
<=
長さ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'