簡単な解決策

簡単な解決策

次のファイルがあります

header start
stuff
header end
pos LV file LVG size
1   a1 AAA  BBB 100
2   b1 AAC  BBB 1000
3   a3 AAB  BBB 47
4   b6 AAC  BBB 1000

a2番目の列から始まる行数を数える必要があります。 Googleでこれを見つけました。

awk '/LVG/{p=$0} {a[p]++} END{for(i in a) print i"\n"a[i]-1}' file

ただし、出力が行数にすぎないようにコンテンツをフィルタリングする必要があります。以下を追加しました。

awk '/LVG/ || $2 ~ "^a"' file | awk '/LVG/{p=$0} {a[p]++} END{for(i in a) print i"\n"a[i]-1}' | tail -1

awkこれが私に必要な作業ですが、これらすべてが1つのコマンドで実行できるかどうか疑問に思います。

ベストアンサー1

最も基本的な要件は次のとおりです。

awk '$2~/^a/{c++} END{print c+0}'

2番目の列をチェックし、正規表現の比較で始まることを確認し、aカウンタを増やしますc。ファイルの最後にカウンタが印刷されます。実際に増加しない数字も印刷されることを保証するために、すでにゼロ以外のc場合はc+0変更されないと印刷しますが、まだ初期化されていない場合は数字として解釈されるようにします。cc

「ヘッダー」セクションを妨げる「残る」トークンがないことを確認するために、最初のチェックは最初の列が整数であることを確認することです。

awk '$1+0==$1 && $2~/^a/{c++} END{print c+0}'

ここでのアイデアは、数値の場合は$1+0算術的に「何も追加しない」と解釈されますが、$1awk文字を追加0「テキスト」の場合、$1+0数値の場合にのみ変更されます。$1

より複雑なチェックのために行をすぐにスキップするだけでなく、「ヘッダーの終わり」行が表示されるまで行が考慮されないようにすることもできます。

awk 'f==2&&$2~/^a/{c++} f==1&&NF{f++} $0=="header end"{f=1} END{print c+0}'

行が見つかると、フラグはf1に設定され、ヘッダーの後の空でない最初の行に設定され、2番目の列が検証される行にのみ設定されます。header end2f2

おすすめ記事