次の形式のテキスト ファイルがあります。
5 3 1
2 3 4
.....
.....
つまり、スペースで区切られた 3 列の数字です。ただし、一部の行は次のようになります:
2
3 1
したがって、テキスト ファイルにこのような不一致があるかどうかを検出し、それを印刷したいと考えています。これはどのように行うのでしょうか。
答え1
awk 'NF != 3'
これは、ちょうど 3 列ではないすべての行を印刷する簡単な方法です。また、そのような行が見つかった場合にコマンドが失敗ステータスを返すようにしたい場合は、次のようにします。
awk 'NF != 3 {print; ++bad} END {exit(!!bad)}'
削除するprint;
と何も印刷されず、終了ステータスを通じてそのような行の存在のみが報告されます。
grep を使用してこれを行うこともできます。
grep -Ev '^[^ ]+ +[^ ]+ +[^ ]+$'
より厳密に、それぞれ整数を含む 3 つの列で構成されていないすべての行を印刷する場合は、次のようにします。
grep -Ev '^([0-9]+) +([0-9]+) +([0-9]+)$'
列区切りとして 1 つ以上のタブを許可する場合は、タブ文字である の代わり[␉ ]+
にを使用します。 を使用すると、正確に 1 つのタブまたはスペースのシーケンスのいずれかが許可されます。 +
␉
(␉| +)
答え2
本当に必要なのが質問のタイトルで尋ねられている内容である場合、次のawk
コマンドは行番号と各行のフィールド数を出力します。
awk '{print NR,NF}'
答え3
awk '{if(NF != 3) print NR,NF}' file.txt
これにより、ファイル内の 3 つのフィールドがない行番号と、それらのフィールドの数が表示されます。