2016-03-29 11 views
-1

Yeni bir Linux kullanıcısıyım ve hala nasıl kullanılacağını anlayamadım, sorunu çok çirkin bir şekilde çözdüm ama ben emin olun, bazı akıllıca sed veya awk. Sorun açıklamak biraz zor, ancak belirli kurallarla biçimlendirilmiş iki metin dosyasının üst üste gelmesiyle ilgilidir.Linux'taki iki dosyanın üst üste gelmesi veya dosya1'den gelen satırların dosya1 ile değiştirilmesi 2

Sorun 1:

Kuralları: dosya1 "custom" oluşur bazı bu satırları SIRASIYLA file2 mevcut hatlarla değiştirilmesi gerekir dize "custom" eşit çizgiler, bu nedenle ilk kez sahiptir file1, file2 ilk satırı yerine dosya2'nin içinde "custom" vardı hattının konacaktır, bu ihtiyacı file1 ikinci kez "custom" oluşur file2 vb "custom" hatların ortaya çıkma da sayıda ikinci hattı ile değiştirilmesi file1 içinde file2'daki satır sayısına eşittir.

Örnek:

File1:

line1 
line2 
custom 
line4 
custom 
line6 

File2:

line3 
line5 

çıkış Bu i çözme

line1 
line2 
line3 
line4 
line5 
line6 

bir yolu, Belki de custom'un ilk oluşumunu aramak için, file2 numaralı satırın ilk satırı ile değiştirin, ilk satırı file2'dan silin, sonraki bir sonraki özel durum araması yapın, ilk satırı file2 olarak alın ve silin. Sed/grep/awk ile daha iyi bir şekilde var olduğundan eminim.

Sorun 2: Bunlar

: kodun

Kullanıcı aslında ona gibi belki sorun böyle formüle edilmiştir eğer çözmek daha kolay olacaktır, dosya2 belirtmek gerekiyor kurallar: her iki dosya1 ve dosya2 şimdi eşit sayıda satır var. Dosya1'deki bazı satırlar, önceki sorundaki gibi "özel" dizgeye eşit. Dosya2, dosya1'deki satırların "özel" değerine eşit olmadığı yerlerde boş satırlara sahiptir, bu yüzden dosya2'yi dosya1 üzerine yapıştırmak ve yalnızca "özel" ile satırların üzerine yazmak istiyorum.

dosya 1 şuna benzer:

line1       
custom 
line3 
custom 
line5 

dosya 2'dir:

/n 
line2 
/n 
line4 
/n 

/n boş satır için standları, çıkış

line1 
line2 
line3 
line4 
line5 

Ayrıca ben çıkışını istiyorum olduğunu çözümünün üzerine yazılacak dosya1 (Ben bunu solution >> file1 yapabilirim)

Hem kullandığınız komutların ne yaptığı, hem sorun hem de açıklama için çözümler istiyorum.

Kod 1'in geçerli sürümü için dosya1'de yalnızca 1-3 satır var, bu yüzden çok fazla if-else senaryosuyla dosya2'de satırları ve kuyrukları çizerek sorunu çözdüm, ama daha zarif bir şey olduğuna eminim mümkün.

BONUS soru:

Öncelikle ayrı değişkenler ($line1, $line2 vs) olarak Dosya1 satırların içeriğini depolanır ve neredeyse awk ile sorun çözüldü, ama bunun nedeni bir $var kabul etmek istemedi '' fiyat teklifleri ve ayrıca "" teklifleriyle çalışmadı. Sed'ün güçlü şeyler yapabildiğini gördüm, ancak string değişkeninde kaydedilen model ile çalıştırılabilir mi? sed'u "" ve $var ile aramayı denedim, ancak her zaman işe yarayacak mı? Aynı şeyi awk ile denedim ve kırdı. Kurtarmaya!

+1

Eğer ** – Vasfed

+0

denenmiş ve neredeyse Awk ** ile sorunu çözdük göstermek edin: İkinci örnek, iki 'line3' hatları olması gerekmiyor söz – anubhava

+0

da çözüm gösterebilir misin? – 123

cevap

0

awk

İlk sorun için, genel olarak tehlikeli kabul edilen getline ile basit bir çözümdür, ancak yan etkilere karşı bağışık iseniz hiçbir zarar yoktur.

$ awk '/custom/{getline < "file2"; print; next} 1' file1 

line1 
line2 
line3 
line4 
line5 
line6 

ikinci durum için, ilk bazı kullanılmayan karakter ile dosyaları birleştirmek ve daha sonra izin awk doğru seçim almak için daha kolay olabilir.

$ paste -d~ file2 file1 | awk -F~ '{print $1==""?$2:$1}' 

line1 
line2 
line3 
line3 
line4 
+1

Mükemmel çalışıyor, kodumdaki 39 satırı bir satırda azalttınız. Dün geceki çözümü çözüm için geçirdim. Çok çok teşekkür ederim :) –

+0

Gönderdiğim başka bir soruya (36317896) şık bir cevap verip vermediğinizi kontrol edebilir misiniz? Bu sorundan dosya1 yapmamış olduğumu farkettim. –

İlgili konular