Linuxで正確に2つの列を持つ行を選択する

Linuxで正確に2つの列を持つ行を選択する

ファイル名と対応する成績表の間のマップであるファイルがあります。ファイル名とレコードはタブで区切られます。

ファイル履歴には、単一のスペースで区切られた1つ以上の単語を含めることができます。以下はファイルのレイアウトです。

[filename] [tab space] [trancription]

一部の行では、転写列は空です。この行は次の形式です。

[filename]

つまり、このファイル名に使用できる履歴はありません。

今私の仕事は、ファイル名と転写(つまり、転写列が空でないファイル)を持つ行のみが選択されていることを確認することです。

私は次のコマンドを試しました

(1) awk 'NF>2' filename

(2) awk 'NF==2' filename

(3) awk 'NF>1' filename

しかし結果はありません。

また、コマンドを使用する場合

(4) awk ' NF==2 {print $0} '   myfile  > newfile

また、「ファイル名」フィールドという列が1つしかない行も取得します。

書き込み時にNF<1出力がありません(予想どおり)。NF<2書き換えると出力がありません(異常です。列が1つだけある行を表示する必要があります)。書くと、NF ==3正確に2つの列の行が表示されます(再び混乱しています)。

質問がありますか?本当に混乱しています。

これで入力サンプルをお送りします。

M07UP36A0821I40.wav 
M07UP36A0821I41.wav 
M07UP36A0821I410.wav    gaajara <bn>
M07UP36A0821I411.wav    tiina sau <pau> taintaaliisa
M07UP36A0821I412.wav    geehuun anya <bn>
M07UP36A0821I413.wav    geehuun daraa <babble>

ここでコマンドを使用します。

grep '^[^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+$' cll

コマンドは出力を提供しませんでした(ターミナルまたはリダイレクトされたファイルの両方で)。

今注目すべき興味深いことがあります。

入力ファイルに以下が含まれている場合

M07UP36A0822I413.wav    <bn> geehuun daraa <horn> <babble>
M07UP36A0822I414.wav    
M07UP36A0822I415.wav    gudxqa piilaa <horn> <babble>
M07UP36A0822I416.wav    <vn> gudxqa
M07UP36A0822I417.wav    gudxqa
M07UP36A0822I418.wav    gudxqa anya <babble>
M07UP36A0822I419.wav    harii matxara <bn> <babble>

また、同じコマンドを使用してください

grep '^[^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+$' foo

端末に出力が表示され始めました。ここで出力は次のようになります。

M07UP36A0822I417.wav    gudxqa

fooファイルに対して私が望む出力は完全な行です(最初の列と2番目の列の両方が必要です)。これが望ましい出力です。

M07UP36A0822I413.wav    <bn> geehuun daraa <horn> <babble>
M07UP36A0822I415.wav    gudxqa piilaa <horn> <babble>
M07UP36A0822I416.wav    <vn> gudxqa
M07UP36A0822I417.wav    gudxqa
M07UP36A0822I418.wav    gudxqa anya <babble>
M07UP36A0822I419.wav    harii matxara <bn> <babble>

私はclllファイルで次のコマンドを使用しました(私の質問の最初の例)

awk -F'\t' '(NF !=2) { print "line: " NR " does not have 2 columns: " $0 ;}' cll

結果が端末に表示されます。明らかにする

line: 1 does not have 2 columns: M07UP36A0821I40.wav 
line: 2 does not have 2 columns: M07UP36A0821I41.wav 
line: 3 does not have 2 columns: M07UP36A0821I410.wav    gaajara <bn>
line: 4 does not have 2 columns: M07UP36A0821I411.wav    tiina sau <pau> taintaaliisa
line: 5 does not have 2 columns: M07UP36A0821I412.wav    geehuun anya <bn>
line: 6 does not have 2 columns: M07UP36A0821I413.wav    geehuun daraa <babble>

ベストアンサー1

使用grep:

grep -E '^[^\s]+\s+[^\s]+$' file.txt
  • [^\s]+最初の列、スペースの数\s+、最後に2番目の(最後の)列を含みます。

  • ^行の始まりを示し、$行の終わりを示します。


POSIX方式:

grep '^[^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+$' file.txt

おすすめ記事