Используйте AWK для печати строк, в которых есть определенная строка, за которой следует число, превышающее 10000 - PullRequest
0 голосов
/ 01 октября 2018

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

column1 column2 column3 column4 column5 column6 Warn=3000
column1 column2 column3 column4 column5 Warn=200
column1 column2 column3 column4 column5 column6 column7 Warn=40000
column1 column2 column3 column4 Warn=100
column1 column2 column3 column4 column5 Warn=20000
column1 column2 column3 column4 Warn=15000

Как видно, количество полей меняется в каждой строке, но последнее поле всегда "Warn =", за которым следуетчисло.Я в основном хочу напечатать все строки, где за строкой «Warn =» следует число больше 10000, и отсортировать их от наибольшего числа к низшему.

Таким образом, результат должен выглядеть следующим образом:

column1 column2 column3 column4 column5 column6 column7 Warn=40000
column1 column2 column3 column4 column5 Warn=20000
column1 column2 column3 column4 column5 Warn=15000

До сих пор мне удавалось достичь желаемого с помощью grep, awk и sort:

grep -E 'Warn=[0-9]{5}' file.txt | awk '{ print $NF, $0 }' | sort -rn -k1 | sed 's/Warn=[0-9]* //'

Есть ли более простой способ сделать это только с помощью awk?

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

С GNU awk для sorted_in:

$ awk -F'=' -v OFS='\t' '$NF>10000{a[NR]=$NF; b[NR]=$0} END{PROCINFO["sorted_in"]="@val_num_desc"; for (i in a) print b[i]}' file
column1 column2 column3 column4 column5 column6 column7 Warn=40000
column1 column2 column3 column4 column5 Warn=20000
column1 column2 column3 column4 Warn=15000

или с любым awk плюс sort + cut:

$ awk -F'=' -v OFS='\t' '$NF>10000{print $NF, $0}' file | sort -nr | cut -f2-
column1 column2 column3 column4 column5 column6 column7 Warn=40000
column1 column2 column3 column4 column5 Warn=20000
column1 column2 column3 column4 Warn=15000
0 голосов
/ 04 октября 2018

Использование Perl с одной строкой

> cat warn.txt
column1 column2 column3 column4 column5 column6 Warn=3000
column1 column2 column3 column4 column5 Warn=200
column1 column2 column3 column4 column5 column6 column7 Warn=40000
column1 column2 column3 column4 Warn=100
column1 column2 column3 column4 column5 Warn=20000
column1 column2 column3 column4 Warn=15000

> perl -ne ' { if(m/(\d+)$/s && $1 >  10000) { $warn{$1}=$_; } }  END { foreach $key(reverse sort keys %warn) { print "$warn{$key}" } } ' warn.txt
column1 column2 column3 column4 column5 column6 column7 Warn=40000
column1 column2 column3 column4 column5 Warn=20000
column1 column2 column3 column4 Warn=15000

>
0 голосов
/ 01 октября 2018

РЕДАКТИРОВАТЬ: Поскольку OP упомянул, что Input_file может иметь = и для других полей, не могли бы вы попробовать потом.

awk '{split($NF,array,"=")} array[1]=="Warn" && array[2]>10000' Input_file | sort -t'=' -k2rn

Не могли бы вы попробовать следующее (учитывая, что фактический Input_file такой же, как показанные образцы).

awk -F' |=' '$(NF-1)=="Warn" && $NF>10000'  Input_file

ИЛИ сортировать с использованием значения:

awk -F' |=' '$(NF-1)=="Warn" && $NF>10000' Input_file | sort -t'=' -k2rn

Вывод будет следующим.

column1 column2 column3 column4 column5 column6 column7 Warn=40000
column1 column2 column3 column4 column5 Warn=20000
column1 column2 column3 column4 Warn=15000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...