我有一个看起来像这样的文件:
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,有没有更简单的方法?
答案 0 :(得分:2)
编辑: 由于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
按值排序的OR:
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
答案 1 :(得分:2)
使用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
答案 2 :(得分:1)
使用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
>