Text-Processing
使用 awk 單獨對文件中的每一列進行數字排序
我正在嘗試對一個非常大的文件中的每一列進行數字排序。我需要命令快速,所以我嘗試在 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]
包含 columni
、 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