Как напечатать конкретную дублирующую строку на основе номера поля - PullRequest
1 голос
/ 14 февраля 2012

Мне нужно распечатать только одну из различных последовательных строк с одним и тем же первым полем, и та, которая должна быть «с дополнительными полями в последнем поле».Это означает, что последнее поле представляет собой набор слов, и мне нужно напечатать строку с большим количеством элементов в последнем поле.В случае одинакового количества элементов max в последнем поле можно использовать любое из значений max.

Пример ввода:

("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 ]

3 голосов
/ 14 февраля 2012

создать индексный файл

$ 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

2 голосов
/ 15 февраля 2012

Используйте [ в качестве разделителя полей, затем разделите последнее поле на , :

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-
0 голосов
/ 15 февраля 2012

Это может работать для вас:

sort -r file | sort -t, -k1,1 -u
0 голосов
/ 14 февраля 2012

Примерно так может работать:

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

Смотрите здесь в действии . НО это не то решение, которое вы хотите использовать, так как это скорее взлом. И он потерпит неудачу, если вы имели в виду, что ваше последнее поле длиннее, если оно содержит больше , разделенных элементов, чем длина вашего последнего элемента. (Например, приведенный выше сценарий радостно сообщает [KABLAMMMMMMMMMMM!] длиннее [A,B,C].)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...