使用Awk对文本文件进行重复数据删除,但将行与非空字段保持一致

时间:2018-08-18 17:51:25

标签: awk

我正在尝试使用Awk对文本文件的行进行重复数据删除,但更喜欢使用非空字段“ f4”保留重复的行(除非所有重复的行都具有空白字段“ f4”)。

Input_File

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|

尝试了代码(不起作用-输出错误):

awk ' BEGIN { FS=OFS="|" }
{ if ( !seen[$2, $3]++ ) print $2, $4 } '   Input_File

错误的输出

f2|f4
bb|
qq|
test|

2 个答案:

答案 0 :(得分:1)

您可以这样做:

awk 'BEGIN{FS=OFS="|"}
     $4 {print $2,$4}' file

要添加dedup逻辑:

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

答案 1 :(得分:0)

编辑: :由于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

如果您只想检查第4个字段,然后在上方更改为:

,上面将检查第2个和第4个字段是否均为非空,然后将打印行。
awk 'BEGIN{FS=OFS="|"} $4{print $2,$4}' Input_file

如果要删除重复项并检查第4列是否存在,请使用以下内容。

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