Text-Processing

使用 awk 單獨對文件中的每一列進行數字排序

  • June 10, 2020

我正在嘗試對一個非常大的文件中的每一列進行數字排序。我需要命令快速,所以我嘗試在 awk 命令中執行此操作。

範例輸入:

1,4,2,7,4
9,2,1,1,1
3,9,9,2,2
5,7,7,8,8

範例輸出:

1,2,1,1,1
3,4,2,2,2
5,7,7,7,4
9,9,9,8,8

我做了一些可以完成這項工作的東西(但它不是我需要的強大的 awk 命令):

for i in $(seq $NumberOfColumns); do 
 SortedMatrix=$(paste <(echo "$SortedMatrix") <(awk -F ',' -v x=$i '{print $x}' File | sort -nr) -d ,)
done

但它很慢!

我試圖在 awk 中做到這一點,我想我已經接近了:

SortedMatrix=$(awk -F ',' 'NR==FNR {for (i=1;i<=NF;i++) print|"sort -nr"}' File)

但它不輸出列(只有一個很長的列),我理解它為什麼這樣做但我不知道如何解決它,我正在考慮在 awk 中使用 paste 但我不知道如何實現它。

有誰知道如何在awk中做到這一點?任何幫助或指導將不勝感激

你可以在一個 GNU awk 中完成它:

gawk -F ',' '
   {
       for(i=1;i<=NF;i++){matrix[i][NR]=$i}
   }
   END{
       for(i=1;i<=NF;i++){asort(matrix[i])}
       for(j=1;j<=NR;j++){
           for(i=1;i<NF;i++){
               printf "%s,",matrix[i][j]
           }
           print matrix[i][j]
       }
   }
' file
  • for(i=1;i<=NF;i++){matrix[i][NR]=$i}

多維數組(GNU 擴展)matrix被填充,因此matrix[i][j]包含 column i、 row的數量j

  • for(i=1;i<=NF;i++){asort(matrix[i])}

對每一列進行排序(GNU 擴展)。

  • 最後
for(j=1;j<=NR;j++){
   for(i=1;i<NF;i++){
       printf "%s,",matrix[i][j]
   }
   print matrix[i][j]
}

為每一行列印一系列a[1],, a[2],, …, a[NF-1],, 。a[NF]\n

引用自:https://unix.stackexchange.com/questions/590329