第(1)列删除空白前导单元格;它可以修复吗?

第(1)列删除空白前导单元格;它可以修复吗?

考虑这种用法专栏(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

如果“非标准”工具没问题,XSV工具包可以很好地格式化或多或少任意的分隔文本数据:

xsv table <<CSV
a,b,c
,ee,ff
CSV
a   b   c
    ee  ff

答案4

如果您的数据是“简单的 CSV”,没有引号或换行符,因此逗号只能出现在分隔字段中,您可以使用它awk来获得您想要的效果:

awk -F, 'BEGIN {OFS="\t"} {$1=$1; print}' <<CSV
a,b,c
,ee,ff
CSV

输出

a       b       c
        ee      ff

相关内容