AWK: для печати данных файла в отсортированном порядке результатов, полученных из столбцов. - PullRequest
1 голос
/ 01 августа 2020

У меня есть входной файл, который выглядит примерно так:

PlayerId,Name,Score1,Score2
1,A,40,20
2,B,30,10
3,C,25,28

Я хочу написать команду awk, которая проверяет игроков с суммой очков больше 50 и выводит PlayerId и PlayerName в отсортированном виде порядок их общей оценки.

Когда я пробую следующее:

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k5

Это не работает и, похоже, сортирует их на основе их идентификаторов.

1 A
3 C

Принимая во внимание, что правильный результат, которого я ожидаю, будет следующим: (поскольку у игрока A сумма баллов = 60, а C имеет сумму баллов = 53, и мы хотим, чтобы результат был отсортирован в порядке возрастания)

3 C
1 A

Вдобавок меня немного смущает то, что я пытаюсь отсортировать его на основе score1, то есть столбца 3, но намереваюсь вывести только соответствующие идентификаторы и имена, это тоже не работает.

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k3

И выводит:

1 A
3 C

Но если $ 3 относительно того, что данные сортируются, включены в печать,

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50)print $1,$2,$3}' | sort -k3

Он производит правильный вывод (но включает нежелательный параметр score1 на дисплее)

3 C 25
1 A 40

Но что, если кто-то хочет распечатать только поля id и name?

На самом деле я новичок в командах awk и, вероятно, я не использую правильно отсортировать команду. Было бы очень полезно, если бы кто-нибудь мог объяснить.

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Я думаю, это то, что вы пытаетесь сделать:

$ awk 'BEGIN{FS=","} {sum=$3+$4} sum>50{print sum,$1,$2}' file |
    sort -k1,1n | cut -d' ' -f2-
3 C
1 A

Вы должны распечатать сумму, чтобы вы могли отсортировать ее, а затем cut удаляет ее.

Если вам тоже нужен вывод заголовка, это будет:

$ awk 'BEGIN{FS=","} {sum=$3+$4} (NR==1) || (sum>50){print (NR>1),sum,$1,$2}' file |
    sort -k1,2n | cut -d' ' -f3-
PlayerId Name
3 C
1 A
2 голосов
/ 01 августа 2020

если вы выполняете сортировку на аутсорсинге, вам необходимо иметь вспомогательные значения и их нужно вырезать позже, некоторые сложности возникают из-за сохранения заголовка.

 $ awk -F, 'NR==1 {print s "\t" $1 FS $2; next}
     (s=$3+$4)>50 {print s "\t" $1 FS $2 | "sort -n" }' file | cut -f2

PlayerId,Name
3,C
1,A
...