我正在尝试使用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|
答案 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