使用Awk删除文本文件中的重复数据,但保留带有非空字段的行

使用Awk删除文本文件中的重复数据,但保留带有非空字段的行,awk,Awk,我尝试使用Awk删除文本文件的行,但更喜欢使用非空字段“f4”保留重复行(除非所有这些重复行都有空字段“f4”) 输入文件 f1|f2|f3|f4|f5 aa|bb|cc||ee aa|bb|cc|dd|ee aa|bb|cc|dd|ee aa|bb|cc||ee aaa|qq|ccc||eee aaa|qq|ccc|zz|eee aaa|qq|ccc|zz|eee aaa|qq|ccc||eee aaa|qq|ccc||eee new|test|ccc||eee new|test|ccc||e

我尝试使用Awk删除文本文件的行,但更喜欢使用非空字段“f4”保留重复行(除非所有这些重复行都有空字段“f4”)

输入文件

f1|f2|f3|f4|f5
aa|bb|cc||ee
aa|bb|cc|dd|ee
aa|bb|cc|dd|ee
aa|bb|cc||ee
aaa|qq|ccc||eee
aaa|qq|ccc|zz|eee
aaa|qq|ccc|zz|eee
aaa|qq|ccc||eee
aaa|qq|ccc||eee
new|test|ccc||eee
new|test|ccc||eee
所需产量

f2|f4
bb|dd
qq|zz
test|
已尝试代码(不工作-输出错误):

错误输出

f2|f4
bb|
qq|
test|
编辑:因为OP更改了问题,所以现在添加新答案。这将检查第二个字段是否有第四个字段,如果有,将打印其唯一值,或者如果所有出现的字段都没有第四个字段,则将打印空字段

awk '
BEGIN{
  FS=OFS="|"
}
FNR==NR{
  if(!a[$2]){
    a[$2]=$4
  }
  next
}
($2 in a) && $4==a[$2]{
  print $2,$4
  delete a[$2]
}'  Input_file  Input_file
输出如下

f2|f4
bb|dd
qq|zz
test|


你能试试下面的吗

awk 'BEGIN{FS=OFS="|"} $2 && $4{print $2,$4}' Input_file
如果第2和第4字段均为非空,则上面将检查第2和第4字段,然后它将打印行,如果您只想检查第4字段,则将上面更改为:

awk 'BEGIN{FS=OFS="|"} $4{print $2,$4}' Input_file
如果您想删除重复项并检查第4列是否存在,请使用以下命令

awk 'BEGIN{FS=OFS="|"} $4 && !a[$4]++{print $2,$4}' Input_file
你可以做:

awk 'BEGIN{FS=OFS="|"}
     $4 {print $2,$4}' file
要添加重复数据消除逻辑,请执行以下操作:

awk 'BEGIN{FS=OFS="|"}
     $4 && seen[$2]++<1 {print $2,$4}' file
awk'BEGIN{FS=OFS=“|”}

$4&&SEED[$2]++能否请您详细说明为什么您的示例输出中有
test |
?它的第四个字段为空。您的编辑使这成为一个根本不同的问题。现在,需要读取和处理整个文件,而不是逐行。@Steve_A,我们始终建议将您的要求以单发形式发布,以后添加条件并不好,因为这可能会浪费我们的努力。@Steve_A,请检查我的编辑答案,然后让我知道好吗?
awk 'BEGIN{FS=OFS="|"}
     $4 && seen[$2]++<1 {print $2,$4}' file