2016-07-28 4 views
0

Я пытаюсь прочитать текстовый файл, как следующийнайти первые 5 максимальных значений в каждой строке, используя AWK

word 1 2 3 4 5 6 7 8 9 10 
hello 0.2 0.3 0.5 0.1 0.7 0.8 0.6 0.1 0.9 

Я хотел бы напечатать слово «привет», а значения Maximun 5 вместе с номер столбца, в котором они, как это, используя AWK:

hello 10 0.9 7 0.8 6 0.7 8 0.6 3 0.5 

Я что-то вроде этого awk '{ for (i=1; i <= 10; i++) a[$i]=$i};END{c=asort(a)?? for(i in a)print i,a[i]??}' думал, но я хотел бы напечатать в каждой строке читать.

ответ

0

Вы сказали [вы] хотели бы напечатать в каждой строке читать поэтому никаких ограничений записей читать:

$ awk '{delete a; for(i=2; i<=NF; i++) {a[$i]=$i; b[$i]=i}; n=asort(a); printf "%s: ",$1; for(i=n; i>n-(n>=5?5:n); i--) printf "%s %s ", b[a[i]], a[i]; printf "\n"}' test.in 
word: 11 10 10 9 9 8 8 7 7 6 
hello: 10 0.9 7 0.8 6 0.7 8 0.6 4 0.5 

Walk-через версию:

{ 
    delete a      # delete the array before each record 
    for(i=2; i<=NF; i++) {   # from the second field to the last 
    a[$i]=$i      # set field to array index and value 
    b[$i]=i      # remember the field number 
    } 
    n=asort(a)      # sort the a array 
    printf "%s: ",$1    # print the record identifier ie. the first field 
    for(i=n; i>n-(n>=5?5:n); i--) # for the 5 (or value count) biggest values 
    printf "%s %s", b[a[i]], a[i] # print them out 
    printf "\n"      # enter after each record 
} 

Если значение повторы, он печатается только один раз.

0

здесь awk помощь в решении набора инструментов Unix.

$ awk -v RS=" " 'NR==1; NR>1{print NR, $0 | "sort -k2nr"} ' file | head -6 | xargs 
hello 10 0.9 7 0.8 6 0.7 8 0.6 4 0.5 

Я думаю, что ваш ожидаемый результат имеет некоторые опечатки.

+0

Спасибо большое, и есть какой-либо способ вместо 'головы -6' что только напечатать первые 6 столбцов в 1 строке, печать 6 колонок но со всеми строками (я имею в виду, если их больше)? –

+0

Извините, я искал, и теперь я знаю, что могу это сделать с помощью 'cut -f 1-6' –

+0

Невозможно получить этот вывод из этого скрипта с учетом размещенного ввода образца. idk, если что-то изменилось ... –

1

С GNU AWK 4. * для sorted_in:

$ cat tst.awk 
BEGIN { PROCINFO["sorted_in"] = "@val_num_desc" } 
NR>1 { 
    split($0,a) 
    printf "%s", a[1] 
    delete a[1] 
    for (i in a) { 
     printf " %d %s", i, a[i] 
     if (++c == 5) { 
      c=0 
      break 
     } 
    } 
    print "" 
} 

$ awk -f tst.awk file 
hello 10 0.9 7 0.8 6 0.7 8 0.6 4 0.5 
Смежные вопросы