2012-08-27 13 views
5

Katılmak istediğim iki csv/text dosyası var. Her ikisi de aynı ilk satırı içerir. Birleştirilmiş bir dosya üretmek için sed ve cat'i nasıl kullanacağımı, ancak ilk satırın yalnızca bir kopyasını bulmaya çalışıyorum. Ve sözdizimi ile bir zaman geçiriyorum. Herhangi bir yardım büyük takdir edilecektir: -D! sayesinde AndrewFile1 + (Dosya2 - ilk satır)> Dosya3

cevap

4

Bu data2.txt gelen ilk satırı atlama, dosyada merged.txt yılında dosyaları data1.txt ve data2.txt birleştirecek. Onunla Tamam eğer awk kullanır:

(cat data1.txt; awk 'NR>1' data2.txt) > merged.txt 

awk merged.txt dosyadan dosyaya data2.txt gelen hat sayısı> 1 ile tüm satırları ekler.

NR, işlenmekte olan dosyanın geçerli satır numarasını temsil eden yerleşik bir awk değişkenidir. Boolean ifadesi NR > 1 doğruysa, awk satırı örtülü olarak yazdırır. Eğer data1.txt bozulmadan saklanması önemli olmadıysa

, sadece 2 dosya (eksi ilk satırı) ekleyin ve azaltabilecek sadece bu kadar:

awk 'NR>1' data2.txt >> data1.txt 
+2

Alternatif olarak, 'awk 'NR> 1'' yerine' tail -n + 2' kullanabilirsiniz. –

+0

@ TannerL.Swett Neat .. Bir şekilde "kafa" ya da "kuyruk" kullanmayı düşünüyordum, ama bunu 'awk' ile nasıl yapacağım konusunda emin oldum. Tabii OP, 'data1.txt' komutunu tutmayı umursamadıysa, çözüm ilk komutu atlayabilir ve sadece 2. dosyayı (ilk satırı) bu dosyaya ekleyebilir. – Levon

4

Awk Başka bir seçenek:

awk 'NR==FNR || FNR>1' file1.txt file2.txt .. fileN.txt 

Bu, ilk satırdaki tüm satırları yazdırır VEYA ilk satırın ardından sonraki dosyalarda herhangi bir satırı yazdırır. bir satır '1 d' ile çözüldü

+0

Eğer bunu yapsaydım ne olurdu: 'awk' NR == FNR || FNR> 1 '* .txt' –

+0

Dosya globbing ile eşleştirilen dosyaların sırasına güvenirsiniz. Hepsi aynı ilk satırları içeriyorsa, bu güvenli olmalıdır. Neden denemiyorsun ve ne olduğunu görmüyor musun? – ghoti

1

Aşağıdaki komut ben en basit çözüm olduğunu söyleyebilirim

sed '1 d' file2 >> file1 
+0

Bu komutla hem 'file1' hem de' file2' değiştiriliyorsunuz - bu OP ile tamamlanabilir veya olmayabilir. Her iki seçeneği de sunmakta daha iyidir (diğeri orijinal dosyalardan birini değiştirmez). – Levon

+0

@Levon: Hayır, burada 'file2' değiştirmiyorsunuz. – tripleee

+0

@tripleee Sadece test ettim, * silme * değil, daha doğrusu * ilk satırı .. * göstermiyor. Muhtemelen cevapta daha iyi ifade edilmiş olabilir. – Levon

2

File1 sonucu ekler file2

ilk satırı silmek için şu anlama gelir:

(cat file1.txt ; tail -n +2 file2.txt) > file3.txt 

açıkça yaptığınızı sadece ne belirten avantajına sahiptir: o se ilk satırında ancak tüm baskı, tüm ilk dosyayı yazdırmak Cond dosyası, çıktıyı üçüncü dosyaya yazıyor.

+0

Vay! Herkese teşekkürler!!!!!!! :-D –