2012-06-25 16 views
5
benim 4 sütun çıkışının

Bölüm şuna benzer:numarasını bulun ve bu sayıya eşit bitişik karakterleri kaldırmak

5 cc1kcc1kc 5 cc1kcc1kc 
5 cc2ppggg 5 cc2ppggg 
6 ccg12qqqqqqqqqqqqggg 10 ccccg11qqqqqqqqqqqggggg 
3 4qqqqcgc1q 12 cgccgccgccgc 

Ben sadece, ikinci ve dördüncü sütunlar değişti istiyorum/sed awk ile bir yol var sayıları yanlarındaki karakterlerle birlikte mi silmek istiyorsunuz? Veya bu dönüşümü gerçekleştirmek için perl betiğinin kullanılması daha kolay mı/daha iyi olur?

Sonuç çıktısı aşağıdaki gibi görünmelidir:

5 ccccc 5 ccccc 
5 ccggg 5 ccggg 
6 ccgggg 10 ccccgggggg 
3 cgc 12 cgccgccgccgc 

cevap

4

anlamıyla soruyu alarak, bu alanda gömülü herhangi n alanlarını 2. ve 4. diğerine n karakterleri kaldırır.

perl -lane 'for $i (1, 3) {@nums = $F[$i] =~ /(\d+)/g; for $num (@nums) {$F[$i] =~ s/$num.{$num}//}}; print join("\t", @F)' 

diğer cevaplar sayısı ve aynı olduğunu izleyen tüm karakterleri kaldırın.

, benim cevap ve diğerleri arasındaki farkı göstermek için aşağıdaki girişini kullanmak:

6 ccg8qqqqqqqqqqqqggg 10 ccccg3qqqqqqqqqqqggggg 

Benim versiyon çıkışlarını bu:

6 ccgqqqqggg  10  ccccgqqqqqqqqggggg 

ise onların çıkış bu:

6 ccgggg 10 ccccgggggg 
3

perl olarak:

perl -pe 's/\d+([^\d\s])\1*//g' 
+0

+1, çünkü bu iş bitti, ama küçük bir açıklama güzel olurdu. – simbabque

+0

Tamam. '-p' seçeneği Perl'in kodunuzun etrafındaki aşağıdaki döngüyü üstlenmesini sağlar (seçenek '-e' ve bir-liner), bu da 'sed' gibi birtakım argümanların üzerinde yineleme yapar. Ve regexp tanımı [sed hakkında] 'da (http://stackoverflow.com/a/11186538/1186729) bakın. –

+2

Bu satır 3 ve 4. sütun 3'teki "10" ve "12" kaldırır. –

2

sed olarak:

sed 's/[0-9]\+\([a-z]\)\1*//g' 

maçı izledi basamak herhangi bir dize ([0-9]+) bulur herhangi bir mektupla ([a-z]). \1*, bu karakterin sonraki tüm olayları ile eşleşir. /g (global) değiştirici, değiştirmenin satır başına bir kereden fazla yapıldığından emin olur.

1

Bu sizin için çalışabilir (GNU sed):

sed 'h;s/\S*\s*\(\S*\).*/\1/;:a;s/[^0-9]*\([0-9]\+\).*/sed "s|\1.\\{\1\\}||" <<<"&"/e;ta;H;g;/\n.*\n/bb;s/\(\S*\s*\)\{3\}\(\S*\).*/\2/;ba;:b;s/^\(\S*\s*\)\(\S*\)\([^\n]*\)\n\(\S*\)/\1\4\3/;s/\(\S*\s*\)\n\(.*\)/\2/' file 
İlgili konular