【Linux】改行とスペース区切りの相互変換

この記事は約3分で読めます。
スポンサーリンク

どういうこと

1 2 3 4 5 6 7 8 9 10     #スペース区切りと
1
2
3
4
5
6
7
8
9
10     #改行区切りを、相互に変換してみよう。

なんで

例えば、lsの結果(ファイル名のスペース区切り)を1行ずつにバラして扱いたいとか

seqの結果(連番の改行区切り)を1行にまとめて扱いたいとか、ありますよね。

個人的に多いシーンは、ホスト名一覧をスペース区切りで生成した後に改行区切りに変換して

その後sshpassでコマンド投入を一括で行う、です。

試行錯誤

改行区切り→スペース区切り

#元コマンド
$ seq 1 10
1
2
3
4
5
6
7
8
9
10

#tr 改行をスペースに変換する、題意通りのコマンド
$ seq 1 10 | tr '\n' ' '
1 2 3 4 5 6 7 8 9 10$     #しまった、10の後ろに改行がない
$ printf "$(seq 1 10 | tr '\n' ' ')\n"     #最後に改行を出力してみよう
1 2 3 4 5 6 7 8 9 10     #できたけど、コマンドが長いね

#awk 万能文字列処理
$ seq 1 10 | awk '{printf "%s ",$0}END{printf "\n"}'     #値の後ろにスペース、最後に改行
1 2 3 4 5 6 7 8 9 10      #一見できたけど、最後にスペースが1つ余分に入っている

スペース区切り→改行区切り

#元コマンド
$ echo {1..10}     #ブレース展開っていう
1 2 3 4 5 6 7 8 9 10

#tr スペースを改行に変換する、題意通り
$ echo {1..10} | tr ' ' '\n'
1
2
3
4
5
6
7
8
9
10     #できたけど、コマンドをもう少しスマートにしたい

$ echo {1..10} | awk -v 'OFS=\n' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10}'     #awkで区切り文字を改行に変換
1
(略)
10     #カラムの数だけ変数名記載では、汎用性がない

行き着いた答え

改行区切り→スペース区切り

$ seq 1 10 | xargs -n 99999     #値を1行あたり99999個まとめて表示
1 2 3 4 5 6 7 8 9 10

スペース区切り→改行区切り

$ echo {1..10} | xargs -n 1     #値を1行あたり1個まとめて表示
1
2
3
4
5
6
7
8
9
10

結論

xargs最強。

参考

xargsは本来、行ごとの値を基にコマンドを生成し実行します。

$ seq 1 3 | xargs -n 1 expr 5 +      #expr 5 + X  のXに1〜3の値を代入しそれぞれ実行。nオプションはまとめる個数。
6     #expr 5 + 1
7     #expr 5 + 2
8     #expr 5 + 3

が、xargsに生成するコマンドを指定しない場合、echo扱いになります。

なので、今回のように行ごとの値個数を変更したいときにも便利です。

コメント

タイトルとURLをコピーしました