我有一个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个小时了,我觉得我做的一切都正常,但为什么额外的空间来了?
答案 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=,