awk重新排列csv文件中的列

时间:2017-08-17 17:57:32

标签: bash csv awk

我有一个csv文件,其中包含5列数据,我需要重新排列列以使运动员列首先出现,然后这里的所有其他列都是名为Final.csv的原始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

我想首先制作athelete 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

我不知道这里出了什么问题我现在已经有4个小时了,我觉得我做的一切都正常,但为什么额外的空间来了?

3 个答案:

答案 0 :(得分:2)

首先,确保libreoffice csv export使用UNIX行结尾。问题解决了。

好吧,sed命令很适合快速检查它是否真的是Windows行结束问题。您可以使用以下awk命令保留窗口行结尾:

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 :(得分: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

答案 2 :(得分:0)

hek2mgl在评论中给出了这个答案,因为线路中断,它完美地发生了

sed 's/\r//' Final.csv | awk -F, '{print $5,$1,$2,$3,$4}' OFS=,