次の形式のテキストファイルがあります。
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つ以上のタブ文字を列区切り文字として許可するには、whereの代わりに[␉ ]+
tabを使用します +
。正確に1つのタブ文字または一連のスペースを許可する␉
ために使用されます。(␉| +)
答え2
本当に欲しいものが質問タイトルの質問である場合、このawk
コマンドは行番号と各行のフィールド数を印刷します。
awk '{print NR,NF}'
答え3
awk '{if(NF != 3) print NR,NF}' file.txt
これにより、3つのフィールドがないファイルの行番号とそのフィールドの数が印刷されます。