はじめに
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"
おわりに
他の方法あります、あるいは上の方法もっと改善できます、など教えていただけると幸いです。