先日行われたシェル芸勉強会の中で、別のファイルから1行ずつデータを取得させたいということがあった。 いろいろとやり方を調べたりしていたのだが、その中でくんすとさんがいい感じの回答をしていた。

cat speech | awk 'NF==0{getline< "speech2"}{print}'#シェル芸

実行例を書いてみる。 以下の例では、「seq.txt」の空行に「aiueo.txt」というファイルの中身を差し込んでいっている。

[blacknon@thinkpad25][~/Work/201910/20191031]
(`・ω・´)  < cat seq.txt
1

2

3

4

5

6

7

8

9

10

[blacknon@thinkpad25][~/Work/201910/20191031]
(`・ω・´)  < cat aiueo.txt
あ
い
う
え
お
か
き
く
け
こ

[blacknon@thinkpad25][~/Work/201910/20191031]
(`・ω・´)  < cat seq.txt | awk 'NF==0{getline<"aiueo.txt"}1'
1
あ
2
い
3
う
4
え
5
お
6
か
7
き
8
く
9
け
10
こ

awkのgetline自体は、過去にOSのコマンド実行時にその結果をawkで取得するために何度か使っていたのだけど、ファイルを1行ずつ読み込むのにも使えたのはちゃんと理解できてなかった。 (というか、こういう使い方が本来あるべき姿なのかもだけど)


参考