我需要打印出具有相同第一个字段的各个连续行中的一个,并且必须是具有“其最后字段中的更多字段”的那一行。这意味着最后一个字段是一组单词,我需要在最后一个字段中打印出包含更多元素的行。如果最后一个字段中有相同数量的最大元素,则任何最大值都可以。
示例输入:
("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的解决方案会很好,但不需要一个衬垫。
答案 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