繁体   English   中英

对齐逗号分隔文件中的列

[英]Align columns in comma-separated file

我在linux中编写脚本,脚本的结果是csv文件。 我想格式化这个文件。 我的输出文件是:

"T_Hours","T_Count","T_Hours","P_Avg_5","Diffrence_Between_P_Avg_5_and_T_Count"
"00","446","00","533","87"
"01","159","01","224","65"
"02","95","02","140","45"
"03","84","03","117","33"
"04","92","04","113","21"

我想像这样输出:

"T_Hours","T_Count","T_Hours","P_Avg_5","Diffrence_Between_P_Avg_5_and_T_Count"
"00"     ,"446"    ,"00"     ,"533"    ,"87"
"01"     ,"159"    ,"01"     ,"224"    ,"65"
"02"     ,"95"     ,"02"     ,"140"    ,"45"
"03"     ,"84"     ,"03"     ,"117"    ,"33"
"04"     ,"92"     ,"04"     ,"113"    ,"21"

我尝试:我尝试后添加空格在它之前,但是,这并不工作,因为这些数字并不总是具有相同的宽度; 例如,在第二列中可能是数字"55556"因此添加特定数量的空格将不起作用。 所以我认为,解决办法是性格转变,在全行把它下,在第一线。 有帮助吗?

这是一种便携式方式:

sed 's/,/:,/g' output.csv |
column -t -s: |
sed 's/ ,/,/g'

说明:

column -t对齐列。 可以使用-s指定输入分隔符,但输出分隔符始终是空格(除非您具有支持-o标志的GNUutil-linux之类的版本,请参阅此答案 。)。

使用column -s, -t output.csv输出就是

"T_Hours" "T_Count" "T_Hours" ...
"00"      "446"     "00"      ...
"01"      "159"     "01"      ...
...

为了保持,在我们要预先和后处理的输出:

  • 使用sed插入一个额外的分隔符:在每个逗号分隔符的前面。 您选择的角色必须是您输入中不存在的角色。
  • 使用column -t指定: character作为分隔符。 column将调整所有的列和替换所有:一个空格。
  • 使用sed删除空格(最初是:我们在第一个命令中插入)。
"T_Hours","T_Count","T_Hours",...
"00"     ,"446"    ,"00"     ,...
"01"     ,"159"    ,"01"     ,...
...

更多信息,请参阅man column

$ column -t -s, -o, file
"T_Hours","T_Count","T_Hours","P_Avg_5","Diffrence_Between_P_Avg_5_and_T_Count"
"00"     ,"446"    ,"00"     ,"533"    ,"87"
"01"     ,"159"    ,"01"     ,"224"    ,"65"
"02"     ,"95"     ,"02"     ,"140"    ,"45"
"03"     ,"84"     ,"03"     ,"117"    ,"33"
"04"     ,"92"     ,"04"     ,"113"    ,"21"

这可能适合你(GNU sed):

sed -r '1{p;s/[^,]/ /g;h;d};G;s/^/\n/;:a;ta;s/\n([^,])(.*\n)\s/\1\n\2/;ta;s/\n,(.*\n)([^,]*,)/\2\n\1/;ta;P;d' file

这使用第一行的标题来设置列宽。 每个数据列都写在一个空格上,从标题创建的逗号分隔模板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM