我創建了一個 awk 檔案,用于對 csv 檔案中的一些資料進行排序。這是資料的片段
|Timestamp |Email |Name |Year|Make |Model |Car_ID|Judge_ID|Judge_Name|Racer_Turbo|Racer_Supercharged|Racer_Performance|Racer_Horsepower|Car_Overall|Engine_Modifications|Engine_Performance|Engine_Chrome|Engine_Detailing|Engine_Cleanliness|Body_Frame_Undercarriage|Body_Frame_Suspension|Body_Frame_Chrome|Body_Frame_Detailing|Body_Frame_Cleanliness|Mods_Paint|Mods_Body|Mods_Wrap|Mods_Rims|Mods_Interior|Mods_Other|Mods_ICE|Mods_Aftermarket|Mods_WIP|Mods_Overall|
|--------------|-------------------------|----------|----|--------|---------|------|--------|----------|-----------|------------------|-----------------|----------------|-----------|--------------------|------------------|-------------|----------------|------------------|------------------------|---------------------|-----------------|--------------------|----------------------|----------|---------|---------|---------|-------------|----------|--------|----------------|--------|------------|
|8/5/2018 14:10|[email protected] |Hernando |2015|Acura |TLX |48 |J04 |Bob |0 |0 |2 |2 |4 |4 |0 |2 |4 |4 |2 |4 |2 |2 |2 |2 |2 |0 |4 |4 |4 |6 |2 |0 |4 |
|8/5/2018 15:11|[email protected] |Noel |2015|Jeep |Wrangler |124 |J02 |Carl |0 |6 |4 |2 |4 |6 |6 |4 |4 |4 |6 |6 |6 |6 |6 |4 |6 |6 |6 |6 |6 |4 |6 |4 |6 |
|8/5/2018 17:10|[email protected] |Edan |2015|Lexus |Is250 |222 |J05 |Adrian |0 |0 |0 |0 |0 |0 |0 |0 |6 |6 |6 |0 |0 |6 |6 |6 |0 |0 |0 |0 |0 |0 |0 |0 |4 |
|8/5/2018 17:34|[email protected] |Hieronymus|1993|Honda |Civic eG |207 |J06 |Aaron |0 |0 |2 |2 |2 |2 |2 |2 |0 |4 |2 |2 |2 |2 |2 |2 |4 |2 |2 |0 |0 |0 |2 |2 |0 |
|8/5/2018 14:30|[email protected] |Nickolas |2016|Ford |Mystang |167 |J02 |Carl |0 |0 |2 |2 |0 |2 |2 |0 |0 |0 |0 |2 |0 |2 |2 |2 |0 |0 |2 |0 |0 |0 |0 |0 |2 |
|8/5/2018 16:12|[email protected] |Martin |2013|Hyundai |Gen coupe|159 |J04 |Bob |0 |0 |2 |0 |0 |0 |2 |0 |0 |0 |0 |2 |0 |2 |2 |0 |2 |0 |2 |0 |0 |0 |0 |0 |0 |
|8/5/2018 17:00|[email protected]|Aldridge |2009|Infiniti|G37 |20 |J06 |Aaron |2 |0 |2 |2 |0 |0 |2 |0 |0 |2 |2 |2 |2 |2 |2 |2 |2 |2 |4 |2 |2 |0 |2 |0 |2 |
|8/5/2018 16:11|[email protected] |Ambros |2009|Honda |Oddesy |178 |J06 |Aaron |2 |0 |2 |2 |2 |2 |2 |0 |4 |4 |2 |2 |2 |4 |4 |4 |2 |2 | |6 |4 |4 |6 |4 |6 |
我能夠產生的輸出資料看起來像這樣
Ranking Car_ID Year Make Model Total
1 48 2015 Acura TLX 62
2 124 2015 Jeep Wrangler 124
3 222 2015 Lexus Is250 40
...
我希望能夠根據總列按降序對上面的輸出進行排序,但我不知道如何在 awk 中這樣做。總計和排名列不是原始 csv 資料的一部分,僅在輸出期間生成。到目前為止,這是我的代碼
BEGIN {
FS = ",";
OFS = "\t\t";
}
NR==1 {
$35 = "Ranking";
$36 = "Total";
}
NR>1 {
$35 = 1;
for(i = 1; i < NR - 1; i ) { $35 = 1 }
$36 = $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31 $32 $33 $34;
}
{
print $35, $7, $4, $5, $6, $36;
}
當我運行它并添加“|sort -nk36|” 在命令結束時,它似乎并沒有改變輸出或以任何方式對其進行排序。也許我讓我的命令感到困惑。
預期的輸出應該是這樣的
Ranking Car_ID Year Make Model Total
1 48 2015 Jeep Wrangler 124
2 124 2015 Acura TLX 62
3 222 2015 Lexus Is250 40
uj5u.com熱心網友回復:
假設:
- 輸入欄位以逗號分隔(而 OP 的示例輸入顯示為具有管道邊界的固定寬度,OP 的
awk代碼規定"FS=",",并且由于 OP 聲稱awk代碼正在運行并生成輸出,我們將堅持使用FS=",") - OP 的示例輸入中的第二行(連字符的實線)實際上并不存在于 OP 的檔案中(實際上 OP 的
awk代碼不編碼NR==2) - 輸出將以制表符分隔(雖然 OP 的
awk代碼提到OFS="\t\t",示例輸出似乎是......固定寬度?) Ranking分配基于排序的結果(即,不基于 OPawk代碼中顯示的輸入排序)
設定:
$ cat raw.dat
Timestamp,Email,Name,Year,Make,Model,Car_ID,Judge_ID,Judge_Name,Racer_Turbo,Racer_Supercharged,Racer_Performance,Racer_Horsepower,Car_Overall,Engine_Modifications,Engine_Performance,Engine_Chrome,Engine_Detailing,Engine_Cleanliness,Body_Frame_Undercarriage,Body_Frame_Suspension,Body_Frame_Chrome,Body_Frame_Detailing,Body_Frame_Cleanliness,Mods_Paint,Mods_Body,Mods_Wrap,Mods_Rims,Mods_Interior,Mods_Other,Mods_ICE,Mods_Aftermarket,Mods_WIP,Mods_Overall
8/5/2018 14:10,[email protected],Hernando,2015,Acura,TLX,48,J04,Bob,0,0,2,2,4,4,0,2,4,4,2,4,2,2,2,2,2,0,4,4,4,6,2,0,4
8/5/2018 15:11,[email protected],Noel,2015,Jeep,Wrangler,124,J02,Carl,0,6,4,2,4,6,6,4,4,4,6,6,6,6,6,4,6,6,6,6,6,4,6,4,6
8/5/2018 17:10,[email protected],Edan,2015,Lexus,Is250,222,J05,Adrian,0,0,0,0,0,0,0,0,6,6,6,0,0,6,6,6,0,0,0,0,0,0,0,0,4
8/5/2018 17:34,[email protected],Hieronymus,1993,Honda,CiviceG,207,J06,Aaron,0,0,2,2,2,2,2,2,0,4,2,2,2,2,2,2,4,2,2,0,0,0,2,2,0
8/5/2018 14:30,[email protected],Nickolas,2016,Ford,Mystang,167,J02,Carl,0,0,2,2,0,2,2,0,0,0,0,2,0,2,2,2,0,0,2,0,0,0,0,0,2
8/5/2018 16:12,[email protected],Martin,2013,Hyundai,Gencoupe,159,J04,Bob,0,0,2,0,0,0,2,0,0,0,0,2,0,2,2,0,2,0,2,0,0,0,0,0,0
8/5/2018 17:00,[email protected],Aldridge,2009,Infiniti,G37,20,J06,Aaron,2,0,2,2,0,0,2,0,0,2,2,2,2,2,2,2,2,2,4,2,2,0,2,0,2
8/5/2018 16:11,[email protected],Ambros,2009,Honda,Oddesy,178,J06,Aaron,2,0,2,2,2,2,2,0,4,4,2,2,2,4,4,4,2,2,,6,4,4,6,4,6
一個GNU awk(PROCINFO["sorted_in"]支持)想法:
awk '
BEGIN { FS=","; OFS="\t" }
FNR==1 { print "Ranking",$7,$4,$5,$6,"Total"; next }
{ totals[FNR]=0
for (i=10;i<=34;i )
totals[FNR] = $i
lines[FNR]=$7 OFS $4 OFS $5 OFS $6
}
END { PROCINFO["sorted_in"]="@val_num_desc" # sort totals[] array by numeric value (descending order)
ranking=0
for (i in totals) # loop through indices of the totals[] array
print ranking,lines[i],totals[i]
}
' raw.dat
這會產生:
Ranking Car_ID Year Make Model Total
1 124 2015 Jeep Wrangler 124
2 178 2009 Honda Oddesy 72
3 48 2015 Acura TLX 62
4 207 1993 Honda CiviceG 40
5 222 2015 Lexus Is250 40
6 20 2009 Infiniti G37 38
7 167 2016 Ford Mystang 20
8 159 2013 Hyundai Gencoupe 14
如果 OP 需要將所有列整齊排列的輸出列印出來,那么可以使用更多代碼來完成,或者我們可以通過管道傳輸結果(假設or列column中沒有嵌入空格),例如:MakeModel
$ awk 'BEGIN ... ' raw.dat | column -t
Ranking Car_ID Year Make Model Total
1 124 2015 Jeep Wrangler 124
2 178 2009 Honda Oddesy 72
3 48 2015 Acura TLX 62
4 207 1993 Honda CiviceG 40
5 222 2015 Lexus Is250 40
6 20 2009 Infiniti G37 38
7 167 2016 Ford Mystang 20
8 159 2013 Hyundai Gencoupe 14
筆記:
- 對于我們在列中有重復值的情況沒有提供額外的排序要求,
Total因此我們將以任何順序列印awk處理END/for回圈中的資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/443909.html
