awk は、他のファイルの行番号を使用してファイルの内容をフィルタリングします。

awk は、他のファイルの行番号を使用してファイルの内容をフィルタリングします。

awk他のファイルの内容に基づいてファイルの特定の内容をフィルタリングしようとしています。しかし、うまくいきません。

orig_dataとnoghest_dataという2つのファイルがあります。どちらのファイルも同じ数の行を持ち、行は同じイベントに対応しますが、内容は異なります。 orig_data notに対応するnoghest_dataの内容を印刷したいと思いますGhest。以下のコードは機能しません。すべてを印刷します。

awk -F " "  'NR==FNR{if($0 ~ /^Ghest/) {line[NR]++} next} !(NR in line) {print $0}' orig_data.txt noghest_data.txt

ベストアンサー1

スクリプトにはほとんど問題はありません。少し簡単にするには:

awk 'NR == FNR && /^Ghest/ {line[NR]} NR > FNR && ! (FNR in line)' \
  orig_data.txt noghest_data.txt

最初のパターン(NR == FNR && /^Ghest/)は、この文字列で始まる最初の入力ファイルの行に対してのみtrueと評価されますGhest。アクションは現在の行番号を配列のインデックスとして追加しますline

NR > FNR && ! (FNR in line)最初のパターンではない入力ファイルの場合、2番目のパターン()はtrueと評価されます。もし現在のファイルに関連付けられている行番号は配列インデックスではありませんlineprint $0この操作を省略した場合はデフォルト)。

〜のようにエドモートン 提案NR、これは一度だけ比較することでより効率的にすることができますFNR

awk 'NR == FNR { if (/^Ghest/) line[NR]; next } !(FNR in line)'

おすすめ記事