Bash

2012-07-19 37 views
10

'daki diğer tüm satırların işlenmesi Tek satırları (1,3,5,7 ..) hiçbir değişiklik yapmadan yazdırmak istiyorum, ancak hatlarla başlayan hatlar (2,4,6,8) grep. Her şeyi yeni dosyaya yazmak istiyorum (herhangi bir değişiklik olmadan tek satırlar ve hatta satırlar için yeni değerler).Bash

awk ' NR % 2 == 1 { print; } NR % 2 ==0 {print; }' file.fasta 

Ancak, daha hatlar için, ben {print; } kullanmak istemiyorum ama bunun yerine benim grep boru hattını kullanmak istiyorum:

Awk içinde her satırı yazdırmak için biliyorum.

Bir tavsiye takdir edilecektir. Çok teşekkürler. doğrudan awk içinden Sen boru can

+3

'== 1 {print;}' gereksizdir, sadece 'awk 'NR% 2' tek satırlık ' – Kevin

+0

yazdıracak yardım için teşekkürler! – Perlnika

cevap

8

grep basit, sen örneğin ek adımla uzakta yapmak ve awk kendi içinde filtreleme yapabilirsiniz:

awk 'NR % 2 {print} !(NR % 2) && /pattern/ {print}' file.fasta 

Ancak, chepner already pointer out, sonra daha fazlasını yapmak istiyorsanız yapabilirsiniz gerçekten boru awk içinden . Örneğin:

komuta "pattern | rev" bir boru (çevreleyen tırnak dikkat edin) açar ve ona baskı çıkış yönlendirir
awk 'NR % 2 {print} !(NR % 2) {print | "grep pattern | rev" }' file.fasta 

. Bu durumda çıktı beklediğiniz gibi olmayabilir; Önce çıkarılan tüm tek satırlarla, ardından da piped komutunun çıktısını alırsınız (bu, çift hatları tüketir).


her bile doğrultusunda karakter sayısını saymak için (yorumlarınızı yanıt olarak), deneyin:

sizin boru hattı çıkışı için
awk 'NR % 2 {print} !(NR % 2) {print length($0)}' file.fasta 
+0

Teşekkürler. Hatta satırların sayısını saymak üzereyim. – Perlnika

+0

@Perlnika awk 'length' komutunu kullanarak chars sayısını alabilirsiniz. Güncellenmiş cevaba bakınız. –

+0

@Perlnika, bazı fasta dosyaları '-' veya' X' gibi garip karakterler içerebilir, ancak muhtemelen OP'nin istediği şeyi cevapladınız. – Steve

6

:

awk ' NR % 2 == 1 { print; } NR % 2 ==0 {print | "grep -o [actgnACTGN] | wc -l"; }' file.fasta 

Bu giriş dosyasının düzeni korumak olmaz, ancak, unutmayın. Bir yapmaya planlıyorsanız

(seçilen cevap el altında görev için daha iyi, ama ben harici komuta baskı deyimi borulama bir örnek olarak burada bu cevabı bırakacağız.)

+0

Teşekkürler, bunu awk ile denedim 'NR% 2 == 1 {print; } NR% 2 == 0 {print | grep -o [actgnACTGN] | wc -l} 'dosyası.fasta (satırdaki harflerin sayısını saymak için) ancak wc ile problem vardı: awk: line 1: wc'de veya yakınında syntax hatası (yani problemin benim pipelineda olduğunu düşünüyorum) – Perlnika

+0

Ne demek istiyorsun? siparişi korumak? – Perlnika

+0

@Perlnika O, önce çıkarılan tüm tek satırlar ile sonlanacak ve daha sonra borunun çıktısı ile sonuçlanacak anlamına gelir (tüm çift hatları tüketir) –

1

sizin AWK çıkışı ile sırayla görünür, sen Her iterasyonda boru hattını kapatmak gerekir. Bu elbette çok verimsiz. Görünüşe göre belirlenen listede olmayan karakterler saymak istemiyorum

awk 'BEGIN{ cmd = "grep -io \047[actgn]\047 | wc -l" } NR % 2 { print } NR % 2 == 0 { print | cmd; close(cmd) }' file.fasta 

yüzden length($0) çalışmaz. sınırlayıcı olarak istiyor ve boyundan alt dizeleri sayısını çıkartarak değil

Bu karakterleri kullanarak çizgiyi bölerek çalışır
awk 'NR % 2 { print } NR % 2 == 0 {n = split($0, a, /[^actgnACTGN]/); print length($0) - n + 1}' file.fasta 

sen do : Bu çalışacak ve daha hızlı boru hattı yöntemine göre daha çok olmalıdır çizgi ve ekleme 1. Özünde, istenmeyen karakterlerin sayısını, istenen karakter sayısından çıkan satırın uzunluğundan çıkarır.