我正在运行一个脚本(我无法控制)来获取以下输出。我想按最后(第三)列排序。每列由空格分隔,第二列包含空格/符号。
> ./script
37622 (this is || test1)&&(SGD||HKD||RMB) 40010
43944 (this is)&&(SGD||HKD) 102732
79378 (this is||test2)&&(HKD||RMB) 205425
457000 (test2) && (SGD||RMB||HKD||YEN) 71
559658 (test1||test2)&&(RMB||YEN||SGD) 14043
我尝试使用 sort -k,但它不起作用。然后我发现了这个问题——如何按最后一列进行数字排序?- 提供的解决方案是
awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
我的问题是:运行脚本时如何利用它?
> ./script | <something??>
谢谢。
答案1
awk
您可以直接调整链接的管道:
$ ./script | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '
在awk
表达式中$x
引用当前行的第 x 列(从 1 开始) - 预定义变量NF
存储当前行的列数,因此print $NF,$0
为每行打印最后一列和完整的行(因为$0
表示完整的行)线)。然后该cut
命令输出每行的第二列到最后一列。
排序部分-k1,1
意味着仅第一列用作排序键 - 仅当多行在第一列中具有相同值时,这才会产生差异。在这种情况下,没有以-k1,1
下列将影响相对顺序(作为次要排序键等)。仅-k1,1
第一列用作排序键 - 并且具有相同键的行的相对顺序不会改变(即执行稳定的排序)。
sed
或者,您可以通过sort
和解决它sed
:
$ ./script | sed 's/^\(.\+[ \t]\+\)\([0-9]\+ *\)$/\2 \1/' | \
sort -k1,1 -n | sed 's/^\([0-9]\+\) \(.\+\)$/\2 \1/'
第一行末尾的换行符通过转义\
- 您可以将其删除\
并作为一行输入管道。
这个想法是首先将最后一列移到前面,按第一列排序,然后再次将其放在后面。
假设最后一列通过空格[ \t]\+
(空格或制表符)分隔。
表达式sed
通过组引用进行交换(例如\2 \1
) - 组通过转义括号在模式中标记:\(...\)