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

4 回答 4

4

从字面上理解这个问题,对于嵌入在字段中的任何n ,这将从字段 2 和 4中删除接下来的n 个字符。

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
于 2012-06-25T21:15:20.663 回答
3

perl

perl -pe 's/\d+([^\d\s])\1*//g'
于 2012-06-25T09:15:01.563 回答
2

使用 sed:

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

匹配找到任何数字字符串 ( [0-9]+) 后跟任何字母 ( [a-z])。\1*匹配该字符的任何后续出现。( /gglobal) 修饰符确保每行多次替换。

于 2012-06-25T09:21:20.993 回答
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
于 2012-06-27T16:59:33.697 回答