考虑这种用法专栏(1):
column -s, -t <<CSV
a,b,c
,ee,ff
CSV
上面的代码片段发出:
a b c
ee ff
但我期待看到这样的事情:
a b c
ee ff
column
似乎从第二行中删除了前导空白“单元格”,而我期望并希望保留它。
有什么方法可以禁用列中的这种空白剥离行为吗?是否有任何标准/推荐的解决方法建议?
我尝试使用RS(1),但我对该命令还有其他问题:rs(1) 在一行中打印所有输出;如何复制输入数组形状?
答案1
使用乐(以前称为 Perl_6)
您可以使用 Raku 的Text::CSV
模块:它将输出符合 RFC-4180(可能还有 RFC-4180/RFC-7111)的文件。不用说,空白的前导单元格被保留。下面,使用不同的列分隔符(选项卡)的输出演示:
~$ raku -MText::CSV -e 'my @a = csv(in => $*IN); csv(in => @a, out => $*OUT, sep => "\t");' file
输入示例:
a,b,c
,ee,ff
示例输出(制表符分隔):
a b c
ee ff
如果您的文件很大和/或您想逐行读取 CSV 文件,请参阅下面的链接。
https://unix.stackexchange.com/a/722776/227738
https://github.com/Tux/CSV/blob/master/doc/Text-CSV.pdf
https://raku.org
答案2
该column
实用程序从每行的开头和结尾删除空列。这会导致您观察到的列未对齐。该实用程序没有选项可以禁用此行为。
如果您想将一般 CSV 文档转换为另一种格式(例如 TSV),更安全的方法是使用支持 CSV 的工具,例如 Miller:
$ mlr --icsv --otsv cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
a b c d,e
ee ff "ok ""hello"""
$ mlr --icsv --opprint cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
a b c d,e
- ee ff ok "hello"
$ mlr --icsv --opprint --barred cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
+---+----+----+------------+
| a | b | c | d,e |
+---+----+----+------------+
| - | ee | ff | ok "hello" |
+---+----+----+------------+
答案3
答案4
如果您的数据是“简单的 CSV”,没有引号或换行符,因此逗号只能出现在分隔字段中,您可以使用它awk
来获得您想要的效果:
awk -F, 'BEGIN {OFS="\t"} {$1=$1; print}' <<CSV
a,b,c
,ee,ff
CSV
输出
a b c
ee ff