我正在运行一个脚本(我无法控制)以获得以下输出。我想按最后(第三)列排序。每列由空格分隔,第二列包含空格/符号。
> ./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)
谢谢你。
您可以直接调整链接管道:
$ ./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只有第一列用作排序键-和使用相同的密钥线的相对顺序不改变(即,稳定的排序被执行)。
或者,您可以通过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) -组被标记为通过转义的括号模式:\(...\)