次の文字列を考えてみましょう。
$ 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
、、xargs
:tr
$ 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