web-dev-qa-db-ja.com

2つのファイルの代替行をマージする

ファイル1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

ファイル2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

出力ファイル:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323
9
pmaipmui

paste を使用:

paste -d \\n file2 file1
23
Stephen Kitt

別のawkソリューション:

awk '{print; getline < "file1"; print}' file2
5
glenn jackman

paste solution は、最も移植性が高く、最も効率的です。 2つのファイルの行数が同じでない場合の動作を好む場合にのみ、この代替案について言及します。

GNU sed

sed Rfile1 file2

file1の行数がfile2より少ない場合、file1を使い果たすと、sedは何も出力しません(pasteの空の行とは対照的です)。

file1file2より多くの行がある場合、それらの余分な行は破棄されます(file2pasteを指定して空の行を出力するのではなく)。

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2
5

awkgawknawkmawk)を使用:

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}NR==FNRは、現在のレコード番号が現在のファイルレコード番号と等しい場合にのみ一致します(したがって、最初のファイルの処理中にのみ一致します):現在処理されているレコードを配列xに等しいインデックスで格納します現在のファイルレコード番号と現在のレコードをスキップ
  • {print x[FNR]"\n"$0}:配列xの内容を、現在のファイルレコード番号とそれに続く改行と現在のレコードの内容に等しいインデックスで出力します
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323
4
kos