2012-06-26 47 views
2

目前我使用以下oneliner用於去除特殊字符之後防止列移位:字符去除

sed 's/[-$*=+()]//g' 

但是有時候會出現一列只包含特殊字符*。 如果只包含*,該如何防止色譜柱移位? 是否可以使用佔位符,以便每當發生第2列和/或第4列中唯一的字符是*時,它會被N替換爲*

來源:

6 cc-g*$ 10 cc+c 
6 c$c$*g$q 10 *** 
6 *c*c$$qq 10 ccc 
6 ** 10 c$cc 
6 ** 10 * 

要可能:

6 ccg 10 ccc 
6 ccgq 10 NNN 
6 ccqq 10 ccc 
6 NN 10 ccc 
6 NN 10 N 

回答

1

在AWK嘗試,

awk '{ if($2 ~ /^[*]+$/) { gsub (/[*]/,"N",$2); } if($4 ~ /^[*]+$/){ gsub (/[*]/,"N",$4); } print }' your_file.txt | sed 's/[-$*=+()]//g' 

我希望這會幫助你。

0

單程使用perl。遍歷每行的所有字段並替換特殊字符,除非字段只有*個字符。之後,用一個空格分隔它們。

perl -ane ' 
    for my $pos (0 .. $#F) { 
     $F[ $pos ] =~ s/[-\$*=+()]//g unless $F[ $pos ] =~ m/\A\*+\Z/; 
    } 
    printf qq|%s\n|, join qq| |, @F; 
' infile 

假設infile有問題的內容,輸出將是:

6 ccg 10 ccc 
6 ccgq 10 *** 
6 ccqq 10 ccc 
6 ** 10 ccc 
6 ** 10 * 
0

這可能會爲你工作(GNU SED):

sed 'h;s/\S*\s*\(\S*\).*/\1/;:a;/^\**$/y/*/N/;s/[*$+=-]//g;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*\)\n\(.*\)/\2/' file