LoginSignup
0
0

More than 1 year has passed since last update.

Bashで改行区切りと空白区切りの相互変換

Last updated at Posted at 2022-02-26

はじめに

Bashを使用して行から列への展開、あるいは列から行への展開を行う方法を複数示します。
ここで、行とは改行で区切られた文字列、列とは半角空白で区切られた文字列を指します。
各コマンドの解説は致しません。

行から列へ

例としてseq 100の結果を使用する。

入力データ
$ seq 100
1
2
3
4
5
...
()
...
98
99
100
期待結果①
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

列数を限定して列展開する方法も示します。(例では3列です。)

期待結果②
1 2 3
4 5 6
7 8 9
10 11 12
...
()
...
94 95 96
97 98 99
100

awk

seq 100 | awk '{printf $0" "}END{print ""}'
seq 100 | awk '{printf $0" "}NR%3==0{print ""}'

xargs

seq 100 | xargs
seq 100 | xargs -n3

sed

seq 100 | sed -z 's/\n/ /g'
seq 100 | sed -zE 's/([^\n]+)\n([^\n]+)\n([^\n]+)\n/\1 \2 \3\n/g'

paste

seq 100 | paste -sd " "
seq 100 | paste -d " " - - -

列から行へ

例としてseq 100 | xargsの結果を使用する。

入力データ
$ seq 100 | xargs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
期待結果
1
2
3
4
5
...
()
...
98
99
100

awk

seq 100 | xargs | awk '{for(i=1;i<=NF;i++){print $i}}'

xargs

seq 100 | xargs | xargs -n1

sed

seq 100 | xargs | sed 's/ /\n/g'

tr

seq 100 | xargs | tr " " "\n"

おわりに

他の方法あります、あるいは上の方法もっと改善できます、など教えていただけると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0