2012-06-25 50 views
5
我的4列輸出的

部分看起來是這樣的:查找號碼,並刪除等於該數字相鄰字符

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

我只想第二和第四列的改變,是有使用awk的方式/ sed將刪除旁邊的字符數字? 或者使用perl腳本執行這種轉換會更容易/更好嗎?

輸出結果應該是這樣的:

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

回答

4

以問題字面解釋,這個去除字段2和4的下一個Ñ字符嵌入式領域任何Ñ

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

其他答案刪除數字和後面的所有字符是相同的。

爲了說明我的回答和其他人之間的差異,請使用以下輸入:

6 ccg8qqqqqqqqqqqqggg 10 ccccg3qqqqqqqqqqqggggg 

我的版本輸出這樣的:

6 ccgqqqqggg  10  ccccgqqqqqqqqggggg 

,而他們的輸出是:

6 ccgggg 10 ccccgggggg 
3

隨着perl

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

+1因爲這可以完成工作,但一點解釋會很好。 – simbabque

+0

好的。選項'-p'使得Perl在你的代碼周圍採用以下循環(選項「-e」和單行),這使得它迭代了諸如'sed'之類的參數。正則表達式的描述參見[關於'sed'的回答](http://stackoverflow.com/a/11186538/1186729)。 –

+2

刪除行3和列3中的「10」和「12」。 –

2

隨着SED:

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

匹配發現隨後的數字任意字符串([0-9]+)由任何字母([a-z])。該\1*匹配該字符的任何後續事件。 /g(全局)修飾符確保替換每行完成一次以上。

1

這可能適用於你(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 
相關問題