Linux 排序最后一列

use*_*496 7 shell sort

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

    > ./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
Run Code Online (Sandbox Code Playgroud)

我尝试使用 sort -k,但它不起作用。然后我发现了这个问题 -如何按最后一列进行数字排序?- 提供的解决方案是

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
Run Code Online (Sandbox Code Playgroud)

我的问题是:当我运行脚本时如何利用它?

    > ./script | <something??>
Run Code Online (Sandbox Code Playgroud)

谢谢你。

max*_*zig 9

awk

您可以直接调整链接管道:

$ ./script | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '
Run Code Online (Sandbox Code Playgroud)

awk表达式中$x引用当前行的第 x 列(从 1 开始) - 并且预定义变量NF存储当前行的列数,因此print $NF,$0为每一行打印最后一列和完整行(因为$0表示完整线)。cut然后该命令输出每行的第 2 列到最后一列。

-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/'
Run Code Online (Sandbox Code Playgroud)

第一行末尾的换行符通过\- 您可以将其删除\并作为一行进入管道。

这个想法是先把最后一列移到前面,按第一列排序,然后再把它放在后面。

假设最后一列通过空格分隔,即[ \t]\+(空格或制表符)。

sed用语不通过组引用交换(例如\2 \1) -组被标记为通过转义的括号模式:\(...\)