我有一个这样的文件。
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 很陌生
如果您不需要保证条目的顺序,则给出
$ 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)