我有一个文本文件,其中包含以下格式的行:
26 20 18 19 43 93
3 16 6 7 47 1
19 9 14 37 22 0
25 27 14 10 62 29
19 6 10 27 33 5
24 14 15 20 21 6
10 17 15 8 47 31
有没有办法在Linux下使用'sort'来根据任意两列的差异对文件进行排序,例如第3列和第4列之间的差异?
我知道排序可以根据特定列进行,例如
sort -r -k 3n data.csv
但不确定它是否可以根据差异进行排序。
也欢迎其他Linux命令。任何脚本语言(如Perl或Python)都可以轻松完成此任务,但我对Linux命令很好奇。
编辑:差异我的意思是数字差异,它有一个符号。 例如,要基于Column3-Column4进行排序,它意味着按-1,-1,-23,4,-17,......排序
答案 0 :(得分:3)
我猜“差异”你的意思是绝对值abs()
。所以你可以这样做:
awk '{d=$3-$4;$0=(d>0?d:-d) "#"$0}7' file|sort -n|sed 's/^.*#//'
输出:
26 20 18 19 43 93
3 16 6 7 47 1
25 27 14 10 62 29
24 14 15 20 21 6
10 17 15 8 47 31
19 6 10 27 33 5
19 9 14 37 22 0
答案 1 :(得分:2)
据我所知,标准sort
命令不会执行字段表达式。但是你可以做一个Schwartzian变换的shell版本:
awk '{print $3-$4,$0}' |
sort -n -k1,1 |
sed 's/^[^ ]* //'