İki dosyadaki alternatif satırları birleştir


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

Çıktı dosyası:

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

2
Lütfen daima işletim sisteminizden bahsedin. Standart araçların çoğu farklı işletim sistemlerinde farklı davranır, bu nedenle ne kullandığınızı bilmemiz gerekir.
terdon

Yanıtlar:




5

pasteÇözelti en taşınabilir ve en etkili yöntemdir. Sadece iki dosyanın aynı sayıda satıra sahip olmaması durumunda davranışını tercih etmeniz durumunda bu alternatiften bahsediyorum:

GNU ile sed:

sed Rfile1 file2

Şundan file1daha az satır varsa file2, o zaman file1tükendiğinde, sedbunun için hiçbir şey çıkarmaz (boş satırların aksine paste).

Şundan file1daha fazla satır varsa , file2bu ekstra satırlar atılır (boş satırları file2ile yazdırmak yerine 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

4

Kullanılması 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==FNRyalnızca geçerli kayıt numarası geçerli dosya kayıt numarasına eşitse eşleştirilir (bu nedenle yalnızca ilk dosya işlenirken eşleştirilir): geçerli olarak işlenen kaydı x, geçerli dosya kayıt numarasına eşit bir dizinde diziye depolar ve şuan ki kayıt
  • {print x[FNR]"\n"$0}: dizinin içeriğini xgeçerli dosya kayıt numarasına ve ardından yeni satıra ve geçerli kaydın içeriğine eşit bir dizinde yazdırır
~/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

Çıktı veriyor ama istediğim gibi değil. tid.info satırları çıktı dosyamdaki tid.setnr satırlarından sonra geliyor.
pmaipmui

@Nainita Örnek çıktınızda gösterdiğiniz şey budur.
kos

@Nainita Her neyse çıkış sırasını değiştirmek için sadece geçiş yapabilirsiniz file1ve file2komutta.
kos

Evet ... Ben de aynısını yaptım ama eskisi gibi basıyordu. tid.setnr yazdırdıktan sonra tid.info yazıyordu.
pmaipmui

1
@mikeserv Ancak ben o zamandan beri ben de denedim mawkve üzerinde de çalışır. Neyse ben işe neden göremiyorum makul olmanın sadece (yani tersi sadece dosyaları geçiş yaparak). awkGirdi umurunda değil , çizgiler çizgilerdir. Bir şey onun sürümü tarafından desteklenmezse, ilk kez kırılmış olurdu. Çok daha kolay, basitçe OP argümanlarda girdi dosyalarını değiştirirken bir hata yaptı.
kos

-1

En kolay çözüm aşağıda verilmiştir.

cat file1 >> file2

veya

cat file2 >> file1

1
sachin, soruyu tekrar okuyun; bu, bir dosyanın içeriğini başka bir dosyanın içeriğine ekler. Bu dosyalar birleştirilmiyorsa alternatif (bu kadar bir satır çizgileri file1gelen sonra bir satır file2... böyle devam eder)
don_crissti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.