[awk] awkで指定行毎に改行除去

2017年5月1日月曜日

awk unix シェルスクリプト

行区切りのデータを適当な行数でまとめるで paste を使って、指定行毎に改行を除去する方法を書いたけど、改めて見ると、こんなの awk で簡単にできるじゃん。

指定行毎に改行を除去するってのは
1
2
3
4
5
6

ってのがあった時に2行ずつまとめたかったら、こんな風になってほしい。
1 2
3 4
5 6

awkでやってみる

実際にawkでやってみると

$ seq 100 |
> awk 'NR % 10 != 0 { printf "%s ",  $1 } NR % 10 == 0 { printf "%s\n", $1 }'
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
$ seq 99 |
> awk 'NR % 10 != 0 { printf "%s ",  $1 } NR % 10 == 0 { printf "%s\n", $1 }'
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 $

行数が区切り行数の倍数じゃない場合

と思ったけど、元の行数が区切り行数のちょうど倍数じゃないと最終行に改行が入らないし、最後に区切り文字が入ったままになっちゃう。
もちろん、sedで行末の区切り文字を除去してあげればいいんですが...

$ seq 99 |
> awk 'NR % 10 != 0 { printf "%s ",  $1 } NR % 10 == 0 { printf "%s\n", $1 }' |
> sed -e '$ s/ $//'
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
$

うーん、行区切りのデータを適当な行数でまとめるの時も、最終行のみ特別扱いするのがいやで paste を使ったのかなー。

xargsでやればよかった

とかやってましたが、結局

$ seq 99 | xargs -n10
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

というオチ。