ファイルの 2 行を比較し、パターンが一致する場合は行を削除します。

ファイルの 2 行を比較し、パターンが一致する場合は行を削除します。

このようなファイルがあります。

12345 X678GHR 0 ADD
23445 HGT6787 1 ADD
12345 X678GHR 0 REM
67894 OIY5678 0 ADD
12345 OIY5678 0 ADD
12345 X678GHR 1 ADD

後で追加して削除した行を削除するには、ファイルの行を比較する必要があります。したがって、出力は次のようになります。

23445 HGT6787 1 ADD
67894 OIY5678 0 ADD
12345 OIY5678 0 ADD
12345 X678GHR 1 ADD

その後、ファイルに追加および削除された履歴は消去されます。

更新:また、2列と3列の間に削除されたレコードが一致することを確認する必要がありました。私の元のファイルでは、区切り文字は空白ではありません。閉じカッコ「)」です。

助けてください。私はUNIXを初めて使用します。

ベストアンサー1

項目の順序を保証する必要がない場合は、以下を提供してください。

$ cat file
12345)X678GHR)0)ADD
23445)HGT6787)1)ADD
12345)X678GHR)0)REM
67894)OIY5678)0)ADD
12345)OIY5678)0)ADD
12345)X678GHR)1)ADD

次は

$ awk -F ')' '
    $NF == "ADD" {lines[$1 FS $2 FS $3] = $0} 
    $NF == "REM" {delete lines[$1 FS $2 FS $3]} 
    END {for(i in lines) print lines[i]}
' file
12345)X678GHR)1)ADD
67894)OIY5678)0)ADD
23445)HGT6787)1)ADD
12345)OIY5678)0)ADD

本当に順序を維持する必要がある場合は、ファイルを2回渡すだけです。

$ awk -F ')' '
    NR == FNR {if($NF == "REM") rem[$1 FS $2 FS $3]; next} 
    !($1 FS $2 FS $3 in rem)
' file file
23445)HGT6787)1)ADD
67894)OIY5678)0)ADD
12345)OIY5678)0)ADD
12345)X678GHR)1)ADD

おすすめ記事