删除字符后防止列移位

时间:2012-06-26 09:49:40

标签: perl unix sed awk

目前我使用以下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

3 个答案:

答案 0 :(得分:1)

尝试使用awk,

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

我希望这会对你有所帮助。

答案 1 :(得分: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 *

答案 2 :(得分: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