文字列を列に結合してbashでテーブルを作成する

文字列を列に結合してbashでテーブルを作成する

次の文字列を考えてみましょう。

$ columnA="A1\nA2\nA3"
$ columnB="B1\nB2\nB3"
$ columnC="C1\nC2\nC3"

Bashを使用してこれらを含む他の文字列を取得するようにこれらをマージするにはどうすればよいですか?

$ echo "$table"
A1;B1;C1\nA2;B2;C2\nA3;B3;C3

答え1

pasteコマンドとプロセスの置き換えを使用できます。

table="$(paste -d ';' <(echo -e "$columnA") <(echo -e "$columnB") <(echo -e "$columnC"))"

echo "$table"出力は次のとおりです。

A1;B1;C1
A2;B2;C2
A3;B3;C3

-eまた、フラグを一緒に使用することを忘れないでくださいecho。それ以外の場合は考慮されず、\n特に次のような出力が得られます。

A1\nA2\nA3;B1\nB2\nB3;C1\nC2\nC3

またはprintfを使用してください。

table="$(paste -d ';' <(printf "$columnA") <(printf "$columnB") <(printf "$columnC"))"

答え2

GNUを使用するdatamash、、xargstr

$ table=$(printf '%b\n' "$columnA" "$columnB" "$columnC" | xargs -n3\
    | datamash -t' ' transpose | tr ' ' ';')
$ table="${table//$'\n'/\\n}"
$ echo "$table"
A1;B1;C1\nA2;B2;C2\nA3;B3;C3
  • printf '%b\n' ...改行で区切られた値を印刷します。
  • xargs -n3行ごとにスペースで区切られた3つの値を結合します。
  • datamash -t' ' transpose出力を移動
  • tr ' ' ';'スペースをセミコロンに置き換える
  • ${table//$'\n'/\\n}改行をテキストに置き換える\n

関連情報