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,

フィールド数を3にawk強制し、入力フィールド区切り記号TABを出力フィールド区切り記号に変換します。NFFOFS,

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,

入力内容にタブやカンマが含まれていると機能しません。

関連情報