2017-08-17 87 views
0

我有一個csv文件,其中包含5列的數據,我需要重新排列列以使運動員列先到來,然後所有其他列在這裏是原始的csv文件名爲Final的.csvawk重新排列csv文件中的列

我粘貼從LibreOffice的輸出,使該輸出沒有逗號和看起來像一個TSV文件,但它是一個CSV文件

Trialtime type Track time Athlete 
20170101 07:15:00 Warmup ABC 85.2 Jon 
20170101 07:45:00 Sprint1 ABC 59.44 Jon 
20170101 08:30:00 TRIAL ABC 57.21 Jon 
20170101 08:00:00 Warmup ABC 120.51 Bill 
20170101 08:40:05 Sprint1 ABC 61.35 Bill 
20170101 09:15:00 Sprint2 ABC 60.08 Bill 
20170101 10:30:00 TRIAL ABC 60.37 Bill 
20170101 07:15:00 Warmup ABC 85.2 Jon 
20170101 07:45:00 Sprint1 ABC 59.44 Jon 
20170101 08:30:00 TRIAL ABC 57.21 Jon 
20170101 08:00:00 Warmup ABC 120.51 Bill 
20170101 08:40:05 Sprint1 ABC 61.35 Bill 
20170101 09:15:00 Sprint2 ABC 60.08 Bill 
20170101 10:30:00 TRIAL ABC 60.37 Bill 

,我想使痤瘡各類coulmn第一ASO我用這個awk命令

awk -F, '{print $5,$1,$2,$3,$4}' OFS=, Final.csv > add.csv 

它重新安排coulmns好嗎但使數據亂碼這樣

,你可以看到有莫名其妙一個額外的場即將在頂部,使得無法使用數據

Athlete    
    Trialtime type Track time 
Jon    
    20170101 07:15:00 Warmup ABC 85.2 
Jon    
    20170101 07:45:00 Sprint1 ABC 59.44 
Jon    
    20170101 08:30:00 TRIAL ABC 57.21 
Bill     
    20170101 08:00:00 Warmup ABC 120.51 
Bill     
    20170101 08:40:05 Sprint1 ABC 61.35 
Bill     
    20170101 09:15:00 Sprint2 ABC 60.08 
Bill     
    20170101 10:30:00 TRIAL ABC 60.37 

我沒有任何現實的想法,在這裏我出現了四個小時左右的錯誤,我認爲我做的都是正確的,但爲什麼會有額外的空間?

+1

是從窗戶進來的文件嗎?在用'awk'處理之前,嘗試用'sed -i''s/\ r //'file'去除窗口行尾。 – hek2mgl

+0

不,我使用Ubuntu 16.04 –

+1

你可以嘗試'sed'命令嗎?它不會損害,當沒有Windows行結束在它 – hek2mgl

回答

2

首先,確保LibreOffice的CSV文件導出使用UNIX行尾。問題解決了。


嗯,sed命令是很好的一個快速檢查,如果它是一個真正的Windows行結束的問題。您可以使用以下awk命令它保留了Windows行結尾:

awk 'BEGIN{FS=OFS=","}{sub(/\r$/,"");print $5,$1,$2,$3,$4"\r"}' Final.csv 

或更優雅,as suggested by EdMorton

awk 'BEGIN{FS=OFS=","} {ORS=(sub(/\r$/,"")?"\r":"")RS; print $5,$1,$2,$3,$4}' Final.csv 

如果你想轉換爲UNIX:

awk 'BEGIN{FS=OFS=","}{sub(/\r$/,"");print $5,$1,$2,$3,$4}' Final.csv 

順便說一句,如果你想很好地對準在輸出列,管awk命令column -t

awk ... | column -t 
+1

考慮:'awk'BEGIN {FS = OFS =「,」} {ORS =(sub(/ \ r $/「」)? 「\ r」: 「」)RS;打印$ 5,$ 1,$ 2,$ 3,$ 4}'Final.csv'用於在輸出中保留'\ r's(如果在輸入中存在),而不會在處理期間將它們放在最後一個字段的末尾。這將確保在開始處理之前從記錄和最終字段中刪除任何'\ r',而不管輸入有多少個字段,都不會將它們從文件中的任何其他位置刪除,並且不會導致記錄成爲重新編譯,如果它們出現在輸入中,將在輸出中重現'\ r's。 –

+0

但那會是'gawk'特定的,對吧? – hek2mgl

+0

沒有,可以在awk中工作。什麼部分看起來gawk特定? –

0

hek2mgl在它的工作完全是因爲線路發生的評論給了這樣的回答打破

sed 's/\r//' Final.csv | awk -F, '{print $5,$1,$2,$3,$4}' OFS=, 
1
awk '{nf=$NF; $NF=""; printf("%-7s %-10s %-10s %-8s %0s %s\n",nf,$1,$2,$3,$4,$5)}' file 

輸出:

 
Athlete Trialtime type  Track time 
Jon  20170101 07:15:00 Warmup ABC 85.2 
Jon  20170101 07:45:00 Sprint1 ABC 59.44 
Jon  20170101 08:30:00 TRIAL ABC 57.21 
Bill 20170101 08:00:00 Warmup ABC 120.51 
Bill 20170101 08:40:05 Sprint1 ABC 61.35 
Bill 20170101 09:15:00 Sprint2 ABC 60.08 
Bill 20170101 10:30:00 TRIAL ABC 60.37 
Jon  20170101 07:15:00 Warmup ABC 85.2 
Jon  20170101 07:45:00 Sprint1 ABC 59.44 
Jon  20170101 08:30:00 TRIAL ABC 57.21 
Bill 20170101 08:00:00 Warmup ABC 120.51 
Bill 20170101 08:40:05 Sprint1 ABC 61.35 
Bill 20170101 09:15:00 Sprint2 ABC 60.08 
Bill 20170101 10:30:00 TRIAL ABC 60.37