2017-08-17 45 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