我在檔案中的資料file1看起來像
3
0
2 0.5
1 0.8
3 0.2
3
1
2 0.1
3 0.8
1 0.4
3
2
1 0.8
2 0.4
3 0.3
每個塊具有相同的行數(這里是 3 2 = 5)。在每個塊中,前兩行是標題,接下來的 3 行有兩列,第一列是標簽,這是從 1 到 3 的數字之一。我想對每個塊中的行進行排序,基于第一列的值(前兩行除外)。所以預期的結果是
3
0
1 0.8
2 0.5
3 0.2
3
1
1 0.4
2 0.1
3 0.8
3
2
1 0.8
2 0.4
3 0.3
我認為sort -k 1 -n file1這對整個檔案都有好處。它給了我錯誤的結果:
0
1
2
3
3
3
2 0.1
3 0.2
3 0.3
1 0.4
2 0.4
2 0.5
1 0.8
1 0.8
3 0.8
這不是預期的結果。
如何對每個塊進行排序對我來說仍然是一個問題。我認為 AWK 可以解決這個問題。請給一些建議。
uj5u.com熱心網友回復:
使用任何 awk sort cut 應用 DSU(裝飾/排序/取消裝飾)習語:
$ awk -v OFS='\t' '
NF<pNF || NR==1 { blockNr }
{ print blockNr, NF, NR, (NF>1 ? $1 : NR), $0; pNF=NF }
' file |
sort -n -k1,1 -k2,2 -k4,4 -k3,3 |
cut -f5-
3
0
1 0.8
2 0.5
3 0.2
3
1
1 0.4
2 0.1
3 0.8
3
2
1 0.8
2 0.4
3 0.3
要了解它在做什么,只需查看前兩個步驟:
$ awk -v OFS='\t' 'NF<pNF || NR==1{ blockNr } { print blockNr, NF, NR, (NF>1 ? $1 : NR), $0; pNF=NF }' file
1 1 1 1 3
1 1 2 2 0
1 2 3 2 2 0.5
1 2 4 1 1 0.8
1 2 5 3 3 0.2
2 1 6 6 3
2 1 7 7 1
2 2 8 2 2 0.1
2 2 9 3 3 0.8
2 2 10 1 1 0.4
3 1 11 11 3
3 1 12 12 2
3 2 13 1 1 0.8
3 2 14 2 2 0.4
3 2 15 3 3 0.3
$ awk -v OFS='\t' 'NF<pNF || NR==1{ blockNr } { print blockNr, NF, NR, (NF>1 ? $1 : NR), $0; pNF=NF }' file |
sort -n -k1,1 -k2,2 -k4,4 -k3,3
1 1 1 1 3
1 1 2 2 0
1 2 4 1 1 0.8
1 2 3 2 2 0.5
1 2 5 3 3 0.2
2 1 6 6 3
2 1 7 7 1
2 2 10 1 1 0.4
2 2 8 2 2 0.1
2 2 9 3 3 0.8
3 1 11 11 3
3 1 12 12 2
3 2 13 1 1 0.8
3 2 14 2 2 0.4
3 2 15 3 3 0.3
請注意,該awk命令只是創建您需要sort按塊號、行號或 $1 等進行排序的鍵值。因此,通過洗掉腳本添加的裝飾值來awk裝飾輸入、對其進行sort排序和取消裝飾。cutawk
uj5u.com熱心網友回復:
您可以sort在 gawk 中使用和陣列
awk 'NF==1 && a[1]{
n=asort(a);
for(k=1; k<=n; k ){print a[k]};
delete a; i=1
}NF==1{print}
NF==2{a[i]=$0; i}
END{n=asort(a); for(k=1; k<=n; k ){print a[k]}}
' file1
你得到
3 0 1 0.8 2 0.5 3 0.2 3 1 1 0.4 2 0.1 3 0.8 3 2 1 0.8 2 0.4 3 0.3
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454049.html
下一篇:Postgresql中的多重排序
