
我正在運行一個腳本(我無法控制)來獲取以下輸出。我想按最後(第三)列排序。每列以空格分隔,第二列包含空格/符號。
> ./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
) - 群組透過轉義括號在模式中標記:\(...\)