bash - 对齐逗号分隔文件中的列

标签 bash sed

我正在 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 指定,但输出分隔符总是一个空格(除非你有像 GNUutil-linux 支持的版本-o 标志,参见 this answer .).

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

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

为了在输出中保留,,我们必须进行预处理和后处理:

  • 使用sed 在每个逗号分隔符前插入一个额外的分隔符:。您选择的字符必须是输入中没有的字符。
  • 使用 column -t 指定 : 字符作为分隔符。 column 将对齐所有列并将所有 : 替换为空格。
  • 使用sed删除空格(原来是我们在第一个命令中插入的:)。
"T_Hours","T_Count","T_Hours",...
"00"     ,"446"    ,"00"     ,...
"01"     ,"159"    ,"01"     ,...
...

更多信息,请参阅 man 专栏

关于bash - 对齐逗号分隔文件中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51471554/

相关文章:

linux - 在文件中搜索字符串的最后一次出现并 append 到它

sed - 如何注释应注释所有行的模式 block 的第一行?

bash - 我将如何在 bash 中用多个分隔符分隔字符串

bash - 无法更改终端中的默认编辑器

windows - VSCode 终端之前的命令

bash - 使用 awk、sed 或 bash 将小写文件名更改为大写

regex - 使用 sed 失败解析 shebang

linux - 在 Linux 上安排一条 zenity 消息

Java:如何在特定目录中运行Java进程?

linux - 在 Linux 中使用匹配模式找到匹配项后添加新行