如何从comm获取格式良好的表?

如何从comm获取格式良好的表?

comm我想使用其他表解析器的输出。然而,它似乎会产生不一致的分隔行。

例如:

$ comm <(echo "1\n2") <(echo "2\n3") | bat -A --style=plain
1␊
├──┤├──┤2␊
├──┤3␊

因为它没有填充剩余的选项卡,所以我无法将其转换为 CSV:

$ comm <(echo "1\n2") <(echo "2\n3") | tr \\t ,
1
,,2
,3

并且也不能将其作为制表符分隔:

$ comm <(echo "1\n2") <(echo "2\n3") | xsv input -d \\t
1
CSV error: record 1 (line: 2, byte: 2): found record with 3 fields, but the previous record has 1 fields

有没有办法生成comm格式正确的表格?我看到的选项似乎比应有的工作更多:

  • 替换为正则表达式
  • 分别打印每一列

答案1

你可以这样做:

$ comm <(echo "1\n2") <(echo "2\n3")  | awk -F'\t' -v OFS=, '{NF=3;print}'
1,,
,,2
,3,

其中awk强制字段NF为 3,并将输入F字段分隔符 TAB 转换为O输出F字段S分隔符,

虽然它可以与 gawk、mawk 或 busybox awk 一起使用,但它不能与原始的 nawk 一起使用,尽管更改NF显然不会导致使用新的 OFS 重新生成记录。或者,你可以这样做:

$ comm <(echo "1\n2") <(echo "2\n3")  | awk -F'\t' -v OFS=, '{$3=$3;print}'
1,,
,,2
,3,

这应该适用于任何现代awk,并且还保证输出具有至少3 个字段(适用于输入文件包含制表符的情况comm)。

答案2

我能够想出一个正则表达式解决方案,尽管它并不漂亮:

$ comm <(echo "1\n2") <(echo "2\n3") | sed -E 's/^\t\t([^\t]*)$|^\t([^\t]*)$|^([^\t]*)$/\3,\2,\1/'
1,,
,,2
,3,

如果您的输入中有制表符或逗号,则此操作将不起作用。

相关内容