2012-06-26 92 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