2011-09-26 11 views
21

awk ile sekme ile ayrılmış alanlar dosyasındaki bazı sütunları nasıl silebilirim?awk veya linux komut satırından bir dosyadan sütun silme

c1 c2 c3 ..... c60 

Örneğin, 3 ve 29 arasındaki sütunlar silin.

+0

stackoverflow Bu cevap size yardımcı olabilir: http://stackoverflow.com/questions/2626274/awk-print-all-other-columns-but-not-1-2-and-3 – iwg

cevap

11

tüm sütunlar üzerinde döngü ve olanları süzmek istemediğiniz edebilirsiniz:

awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt 

NF size kayıttaki alanların sayısını verir.
Koşulları karşılayan her sütun için, sütunu ve ardından " " boşluğunu yazdırıyoruz.


DÜZENLEME: johnny gelen sözler sonrasında güncelleme:

awk -F 'FS' 'BEGIN{FS="\t"}{for (i=1; i<=NF-1; i++) if(i<3 || i>5) {printf $i FS};{print $NF}}' input.txt 

bu 2 şekilde geliştirildi:

  • ucunda bir ayırıcı eklemek gelmez orijinal ayırıcılar tutar
+0

değil Olmalı boşluk yerine bir sekme (\ t) yazdırırsınız. Alanları kaldırmak, belki de aynı zamanda sekmeleri kaldırmamak (eğer sizi doğru anlıyorsam). – johnny

+0

@johnny: haklısın. Kodu güncelledim, böylelikle ayırıcıyı doğru olarak düşünmeliyim. – oliver

41
cut -f1,2,30- inputfile 

varsayılan sekme geçerli:Bu cut komut için budur. Bunu -d anahtarıyla değiştirebilirsiniz.

+0

Ubuntu'da çalışabilmek için en son '-' yi kaldırmak zorunda kaldım. Eğer onu bırakırsam, 'kes' tüm sütunları basardı. Bu sorunu da gören var mı? –

+0

Sonuncuya bir, iki ve otuz sütun basması gerekir (sorudaki 60). Eğer bu Ubuntu'da bir hata değil! –

+0

Aaaah, tamam. Bir hata yaptım. Benim hatam. –

1
awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1' 

giriş

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 

Çıkış

c1 c2 c16 c17 c18 c19 c20 c21 
+0

Bu, sütunları silmez. Onları boşaltır ve tekrar yazdırır ... OP'nin 'O * FS' ile belirtilen '\ t' yerine, istemedikleri tek bir yer almıştır. _apparent_ delesyonu rastlantısaldır ve 'FS' ve' OFS''nın '\ s +' varsayılanı olması gerekir. Oldukça işe yaramaz bir ayırıcı ve OP ''t' ile uyumsuz, onların dosyaları rastlantısal olarak boş alanlara sahip olmadıkça, onları pürüzlü satırlara sıkıştırır. Başka herhangi bir ayırıcı, ör. OP '' 't, hala istenmeyen sütunlara sahip çıktı verir, ama şimdi boş. Ve '$ 0 = $ 0' gereksiz ve savurgan olabilir. Bir kaydı yeniden oluşturmak için belgelenmiş yöntem: $ 1 = $ 1' –

0
ön ya da arka boşluk eklemez

Perl 'uç' çözüm:

perl -lane 'splice @F,3,27; print join " ",@F' file 

üretir çıkışı:

c1 c2 c30 c31 
İlgili konular