比较文件中的两行,如果模式匹配则删除它们

Sri*_*Sri 2 sed awk

我有一个这样的文件。

12345 X678GHR 0 ADD
23445 HGT6787 1 ADD
12345 X678GHR 0 REM
67894 OIY5678 0 ADD
12345 OIY5678 0 ADD
12345 X678GHR 1 ADD
Run Code Online (Sandbox Code Playgroud)

我必须比较文件中的行以删除稍后添加和删除的行。所以输出应该是这样的:

23445 HGT6787 1 ADD
67894 OIY5678 0 ADD
12345 OIY5678 0 ADD
12345 X678GHR 1 ADD
Run Code Online (Sandbox Code Playgroud)

清除了后来从文件中添加和删除的记录。

更新:我还必须确保第 2 列和第 3 列在删除记录之间也匹配。在我的原始文件中,分隔符不是空格。它是一个封闭的括号“)”

请帮忙。我对 UNIX 很陌生

ste*_*ver 6

如果您不需要保证条目的顺序,则给出

$ 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
Run Code Online (Sandbox Code Playgroud)

下面的awk

$ 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
Run Code Online (Sandbox Code Playgroud)

如果确实需要保留顺序,则可以通过对文件进行两次传递来实现:

$ 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
Run Code Online (Sandbox Code Playgroud)