2013-04-02 10 views
11

'X' biçimini içeren 'Satır X' ve 'Y'Sed/Awk - x ve y desenleri arasındaki çizgileri çekin

modelini içeren Satır Y arasındaki tüm verileri ayıklamak istediğim bazı büyük CSV dosyalarım var Örneğin

:

ben arasındaki boru şeyi mümkün (ve dahil) olmak istiyorum
other_data 
Header 
data 
data 
data 
Footer 
other_data 

Başlık -> yeni bir dosyaya Altbilgi.

Teşekkürler!

cevap

16

awk Kullanılması oldukça basittir:

awk '/Header/ { show=1 } show; /Footer/ { show=0 }' 

Temelde show adında bir değişkende devlet tutun. Başlığa çarptığımızda onu açıyoruz, Footer kapatıyoruz. Açıkken, show kuralı, kaydı yazdırmanın varsayılan eylemini yürütür.

+0

, açıklama için teşekkür ederim! – Numpty

+3

+1 Bu, ilk satırı veya son satırı veya her iki satırı veya yapmak istediğiniz başka bir şeyi yazdırmak istediğiniz durumları kapsayacak şekilde kolayca geliştirilebildiğinden doğru cevaptır. Hafif öneme sahip iken/start /,/end/ranges kullanarak elde edilen çözümler en ufak bir gereksinim değişikliğine neden olur - bu model önemsiz problemlere çözüm getirir, ancak önemsiz olmayan problemlere çözümler ÇOK daha uzun ve karmaşıktır veya yeniden yazma gerektirir. bu tarz. –

14

Bu oldukça basittir sed:

sed -n '/Header/,/Footer/p' 

veya

sed '/Header/,/Footer/!d' 
+0

AWK'nın yanı sıra çalışır, teşekkürler. Buraya ilk geldiğinden beri Fatal'e kabul edeceğim, ama bunun için teşekkür ederim. İşte bir +1 – Numpty

+1

İlk seçeneği ('/ p' biten), awk çözümü olarak zamanın 1/4'ünü aldım. İkinci seçenek ('/! D'), awk ile aynı süreyi aldı. Büyük bir dosyada, konu başlıyor. – RaveTheTadpole

+0

Bu, aynı zamanda sınırlayıcı olduğunda da çalışır. 'Awk' versiyonu sadece farklı olduklarında çalışır. – akostadinov

9

diğer bir yolu awk ile:

awk '/Header/,/Footer/' file 
Header 
data 
data 
data 
Footer 

Sadece bir newfile kaydetmek çıkışını yönlendirmek:

awk '/Header/,/Footer/' file > newfile 
+1

Sizin için en güzel, bu yüzden bir puan olsun :) – Numpty

+0

Evet, bu en iyi gibi görünüyor. +1. – Beta

+0

Merak ediyorum: Bu tür bir deseni kullanarak "Başlıktan sonuna kadar bir" var mı? (En iyi awk çözümünü kullanmak çok kolaydır, ancak "/ Footer /" yerine "dosya sonu" işareti olup olmadığını merak etmek) –

1

Bu sizin için işe yarayabilecek (GNU sed): mükemmel çalışıyor

sed '/^Header/,/^Footer/w new_file' file 
+0

Bu işe yarar, ancak orijinal dosyanın tamamını stdout'a yönlendirir. Bu da borularla kullanılmasını zorlaştırır. – Sparhawk

İlgili konular