Linux命令:如何根据列之间的差异对文件进行排序?

时间:2013-10-17 20:39:55

标签: linux shell sorting

我有一个文本文件,其中包含以下格式的行:

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,......排序

2 个答案:

答案 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/^[^ ]* //'