Eng*_*ng7 4 awk text-processing
我有以下文件:
6180,6180,0,1,,1,0,1,1,0,0,0,0,0,0,0,0,4326,4326,,0.440000,
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
4673,4673,0,1,,1,0,1,1,0,0,0,0,0,0,0,0,1707,1707,,0.000000,
Run Code Online (Sandbox Code Playgroud)
我需要一个 awk 命令,它以 18 美元的价格打印出 21 美元的最大值。
所需的输出将如下所示:
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果,但是使用了 sort 命令,如下所示:
sort -t, -k18,18n -k21,21nr | awk -F"," '!a[$18]++'
Run Code Online (Sandbox Code Playgroud)
虽然我想用单个 awk 命令来完成它。
请指教,
我不明白您为什么要在单个awk命令中执行此操作,您所拥有的似乎非常好。无论如何,这是一种方法:
$ awk -F, '(max[$18]<$21 || max[$18]==""){max[$18]=$21;line[$18]=$0}
END{for(key in line){print line[key]}}' file
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
Run Code Online (Sandbox Code Playgroud)
这个想法很简单。我们有两个阵列,max具有$18作为重点,并$21作为值。对于每一行,如果保存的值$18小于$21或没有保存的值$18,那么我们将当前行($0)存储为$18数组中的值line。最后,在END{}块中,我们打印 array line。
请注意,上面的脚本将其$18视为字符串。因此,001和1将被视为不同的字符串。
| 归档时间: |
|
| 查看次数: |
1276 次 |
| 最近记录: |