data.txt
ファイルの2番目の列パラメータの1つを含むすべての行を削除したいですkeys.txt
。
keys.txt
2 aa 2 bb 2 cc 2 dd
data.txt
1 aa It is great 1 aa I want to delete this line 1 kk Really ? 1 bb Yes, I think so. 1 bb Why ? 1 kk Because I don't like the current situation 1 ll I want to change 1 cc Indeed it's a need 1 cc Sorry 1 zz Ok !
- 希望の出力
1 kk Really ? 1 kk Because I don't like the current situation 1 ll I want to change 1 zz Ok !
次のプログラムを試してみましたawk
。
awk '
NR == FNR {pattern[$0]; next}
{
for (var in pattern) {
if ($0 ~ var) {
getline
next
}
}
print >> GoodFile.txt
}
' keys.txt
ベストアンサー1
あなたはかなり近かったが、いくつかの小さな点が欠けている。
data.txt
これを呼び出しにパラメータとして追加する必要がありますawk
。それ以外の場合、ファイルは処理されません。- 現在、行全体を
keys.txt
削除データベースに登録しているので、2番目のフィールド($2
代わりに$0
)に制限する必要があります。 if ($0 ~ var)
行を除外する必要があるかどうかを確認するために使用されます。data.txt
ここでも行の2番目のフィールドのみを比較する必要があり、キーに==
正規表現関連文字を含めることができないようにするには、正規表現一致ではなく完全一致()を使用する必要があります。- から印刷し
awk
ますが、必ずしもそうする必要はありません。代わりに出力をリダイレクトできます。
したがって、少し変更すると、次のようになります。
awk 'NR==FNR{pattern[$2];next} !($2 in pattern)' keys.txt data.txt > GoodFile.txt
keys.txt
これは配列の各行の2番目の列を登録しますpattern
が、ファイルに対して他の操作は実行しません。なぜなら、data.txt
各行について条件が評価される点に達するからです。!($2 in pattern)
条件が「true」と評価される場合(つまり、行の2番目の列いいえ配列のインデックスからpattern
)現在の行が印刷されます。