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,
フィールド数を3にawk
強制し、入力フィールド区切り記号TABを出力フィールド区切り記号に変換します。N
F
F
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,
入力内容にタブやカンマが含まれていると機能しません。