Linux 对最后一列进行排序

Linux 对最后一列进行排序

我正在运行一个脚本(我无法控制)来获取以下输出。我想按最后(第三)列排序。每列由空格分隔,第二列包含空格/符号。

    > ./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) - 组通过转义括号在模式中标记:\(...\)

相关内容