1

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

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 可以根据特定的列来做到这一点,例如,

sort -r -k 3n data.csv

但不确定它是否可以根据差异进行排序。

也欢迎使用其他 Linux 命令。任何脚本语言,如 Perl 或 Python 都可以轻松完成这项任务,但我对 Linux 命令很好奇。

编辑:差异是指数字差异,它有一个符号。比如按照Column3-Column4排序,就是按照-1、-1、-23、4、-17、...排序

4

2 回答 2

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
于 2013-10-17T20:47:47.720 回答
2

据我所知,标准sort命令不执行字段表达式。但是你可以做一种 Schwartzian 变换的 shell 版本:

awk '{print $3-$4,$0}' | 
sort -n -k1,1 | 
sed 's/^[^ ]* //'
于 2013-10-17T20:44:16.653 回答