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) - 群組透過轉義括號在模式中標記:\(...\)

相關內容