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
强制字段N
数F
为 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,
如果您的输入中有制表符或逗号,则此操作将不起作用。