如何根据字段编号打印特定的重复行

时间:2012-02-14 11:09:57

标签: awk duplicates

我需要打印出具有相同第一个字段的各个连续行中的一个,并且必须是具有“其最后字段中的更多字段”的那一行。这意味着最后一个字段是一组单词,我需要在最后一个字段中打印出包含更多元素的行。如果最后一个字段中有相同数量的最大元素,则任何最大值都可以。

示例输入:

("aborrecimento",[Noun],[Masc],[Reg:Sing],[Bulk])
("aborrecimento",[Noun],[Masc],[Reg:Sing],[Device,Concrete,Count])
("aborrecimento",[Noun],[Masc],[Reg:Sing],[])
("adiamento",[Noun],[Masc],[Reg:Sing],[])
("adiamento",[Noun],[Masc],[Reg:Sing],[Count])
("adiamento",[Noun],[Masc],[Reg:Sing],[VerbNom])

示例输出:

("aborrecimento",[Noun],[Masc],[Reg:Sing],[Device,Concrete,Count])
("adiamento",[Noun],[Masc],[Reg:Sing],[VerbNom])
使用awk的解决方案会很好,但不需要一个衬垫。

4 个答案:

答案 0 :(得分:3)

生成索引文件

$ cat input.txt |
sed 's/,\[/|[/g' | 
awk -F'|' '
{if(!gensub(/[[\])]/, "", "g", $NF))n=0;else n=split($NF, a, /,/); print NR,$1,n}
' | 
sort -k2,2 -k3,3nr | 
awk '$2!=x{x=$2;print $1}' >idx.txt

索引文件的内容

$ cat idx.txt
2
5

选择行

$ awk 'NR==FNR{idx[$0]; next}; (FNR in idx)' idx.txt input.txt
("aborrecimento",[Noun],[Masc],[Reg:Sing],[Device,Concrete,Count])
("adiamento",[Noun],[Masc],[Reg:Sing],[Count])

注意: input.txt

中没有空格

答案 1 :(得分:2)

使用 [作为字段分隔符,然后拆分上的最后一个字段,

awk -F '[[]' '
    {split($NF, f, /,/)}
    length(f) > max[$1] {line[$1] = $0; max[$1] = length(f)}
    END {for (l in line) print line[l]}
' filename

由于订单很重要,因此需要更新:

awk -F '[[]' '
    {split($NF, f, /,/)}
    length(f) > max[$1] {line[$1] = $0; max[$1] = length(f); nr[$1] = NR}
    END {for (l in line) printf("%d\t%s\n", nr[$1], line[l])}
' filename |
sort -n |
cut -f 2-

答案 2 :(得分:0)

这样的事可能有用:

awk 'BEGIN {FS="["} 
     Ff != gensub("^([^,]+).*","\\1","g",$0) { Ff = gensub("^([^,]+).*","\\1","g",$0) ; Lf = $NF ; if (length(Ml) > 0) { print Ml } }
     Ff == gensub("^([^,]+).*","\\1","g",$0) { if (length($NF) > length(Lf)) { Lf=$NF ; Ml=$0 } }    
     END {if (length(Ml) > 0) { print Ml } }' INPUTFILE

See here in action这不是你想要使用的解决方案,因为这是一个黑客攻击。如果你的最后一个字段比你最后一个元素的长度包含更多,个分隔元素,那么它就会失败。 (例如,上述脚本愉快地报告[KABLAMMMMMMMMMMM!]的时间长于[A,B,C]。)

答案 3 :(得分:0)

这可能对您有用:

sort -r file | sort -t, -k1,1 -u