Gabungkan baris alternatif dari dua file

9

File1:

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

File2:

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

Berkas keluaran:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323
pmaipmui
sumber
2
Harap selalu sebutkan sistem operasi Anda. Banyak alat standar berperilaku berbeda pada OS yang berbeda sehingga kami perlu tahu apa yang Anda gunakan.
terdon

Jawaban:

23

Menggunakan paste:

paste -d \\n file2 file1
Stephen Kitt
sumber
5

Solusi awk lainnya:

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

The pastesolusi adalah yang paling portabel dan paling efisien. Saya hanya menyebutkan alternatif ini jika Anda lebih suka perilakunya dalam kasus di mana kedua file tidak memiliki jumlah baris yang sama:

Dengan GNU sed:

sed Rfile1 file2

Jika file1memiliki lebih sedikit baris daripada file2, maka ketika file1habis, sedtidak akan menghasilkan apa pun untuk itu (sebagai lawan dari baris kosong untuk paste).

Jika file1memiliki lebih banyak garis dari file2, maka garis-garis tambahan tersebut akan dibuang (sebagai lawan mencetak baris kosong untuk file2dengan paste).

$ 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
Stéphane Chazelas
sumber
4

Menggunakan awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNRhanya cocok jika nomor catatan saat ini sama dengan nomor catatan file saat ini (karenanya hanya cocok saat memproses file pertama): menyimpan catatan yang saat ini diproses ke dalam array xpada indeks sama dengan nomor catatan file saat ini dan melompati catatan saat ini
  • {print x[FNR]"\n"$0}: mencetak konten array xpada indeks yang sama dengan nomor catatan file saat ini diikuti oleh baris baru dan oleh konten catatan saat ini
~/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
kos
sumber
Ini memberikan output tetapi tidak persis sama dengan apa yang saya inginkan. baris tid.info datang setelah baris tid.setnr di file output saya.
pmaipmui
@Nainita Itulah yang Anda tampilkan dalam contoh output Anda.
kos
@Nainita Pokoknya untuk beralih urutan output Anda bisa langsung beralih file1dan file2di perintah.
kos
Ya ... Saya telah melakukan hal yang sama tetapi mencetak persis seperti sebelumnya. setelah mencetak tid.setnr maka itu priting tid.info.
pmaipmui
1
@ mikeserv Namun sejak saya di sana saya mencoba mawkjuga, dan itu berjalan di atasnya juga. Pokoknya menjadi wajar saya tidak bisa melihat mengapa hal itu tidak harus bekerja hanya sebaliknya (yaitu hanya dengan beralih file). Bukannya awkpeduli dengan input, garis adalah garis. Jika sesuatu tidak didukung oleh versinya, itu baru saja rusak pertama kali. Caranya lebih mudah, cukup OP melakukan kesalahan saat mengganti file input dalam argumen.
kos
-1

Solusi termudah diberikan di bawah ini.

cat file1 >> file2

atau

cat file2 >> file1
sachin
sumber
1
sachin, baca lagi pertanyaannya; ini menambahkan konten dari satu file ke konten file lain. Itu tidak menggabungkan file bolak - balik baris (jadi satu baris dari file1kemudian satu baris dari file2dan seterusnya ...)
don_crissti