2番目の列に4単語以下の行を表示します。

2番目の列に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>

明らかに、ファイルには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'

関連情報