Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 是否将字母添加到字符串的第二个/第三个/第四个匹配项?_Shell_Unix_Awk_Sed - Fatal编程技术网

Shell 是否将字母添加到字符串的第二个/第三个/第四个匹配项?

Shell 是否将字母添加到字符串的第二个/第三个/第四个匹配项?,shell,unix,awk,sed,Shell,Unix,Awk,Sed,我有一个大的文本文件,如下所示: 1 1:49298 0 49298 T C 1 1:54676 0 54676 T C 1 1:54676 0 54676 A G 1 1:86028 0 86028 C T 1 1:86028 0 86028 T G 1 1:86028 0 86028 A G 1 1:91536 0 91536 T G 1 1:49298 0 49298

我有一个大的文本文件,如下所示:

1   1:49298 0   49298   T   C
1   1:54676 0   54676   T   C
1   1:54676 0   54676   A   G
1   1:86028 0   86028   C   T
1   1:86028 0   86028   T   G
1   1:86028 0   86028   A   G
1   1:91536 0   91536   T   G
1   1:49298 0   49298   T   C
1   1:54676 0   54676   T   C
1   1:54676b    0   54676   A   G
1   1:86028 0   86028   C   T
1   1:86028b    0   86028   T   G
1   1:86028c    0   86028   A   G
1   1:91536 0   91536   T   G
第二列包含一些倍数-肯定有重复项,可能有重复项等,但我还没有充分探讨这一点

我想在第2栏第二次出现的末尾加上字母“b”,在第三次出现的末尾加上字母“c”,在第四次出现的末尾加上字母“d”,依此类推。因此,输出文件应如下所示:

1   1:49298 0   49298   T   C
1   1:54676 0   54676   T   C
1   1:54676 0   54676   A   G
1   1:86028 0   86028   C   T
1   1:86028 0   86028   T   G
1   1:86028 0   86028   A   G
1   1:91536 0   91536   T   G
1   1:49298 0   49298   T   C
1   1:54676 0   54676   T   C
1   1:54676b    0   54676   A   G
1   1:86028 0   86028   C   T
1   1:86028b    0   86028   T   G
1   1:86028c    0   86028   A   G
1   1:91536 0   91536   T   G

我认为这可以用awk来完成,但我还没有找到任何可行的选择。

这可能就是您想要的:

$ awk 'cnt[$2]++ { $2=sprintf("%s%c", $2, 96 + cnt[$2]) } 1' file | column -t
1  1:49298   0  49298  T  C
1  1:54676   0  54676  T  C
1  1:54676b  0  54676  A  G
1  1:86028   0  86028  C  T
1  1:86028b  0  86028  T  G
1  1:86028c  0  86028  A  G
1  1:91536   0  91536  T  G

这可能是您正在寻找的:

$ awk 'cnt[$2]++ { $2=sprintf("%s%c", $2, 96 + cnt[$2]) } 1' file | column -t
1  1:49298   0  49298  T  C
1  1:54676   0  54676  T  C
1  1:54676b  0  54676  A  G
1  1:86028   0  86028  C  T
1  1:86028b  0  86028  T  G
1  1:86028c  0  86028  A  G
1  1:91536   0  91536  T  G
还有:

awk '{if ($4 == previous) {i++; print $1, $2sprintf("%c", 97+ i),$3,$4,$5,$6} else {previous = $4; i = 0; print;}}' file
1   1:49298 0   49298   T   C
1   1:54676 0   54676   T   C
1 1:54676b 0 54676 A G
1   1:86028 0   86028   C   T
1 1:86028b 0 86028 T G
1 1:86028c 0 86028 A G
1   1:91536 0   91536   T   G
还有:

awk '{if ($4 == previous) {i++; print $1, $2sprintf("%c", 97+ i),$3,$4,$5,$6} else {previous = $4; i = 0; print;}}' file
1   1:49298 0   49298   T   C
1   1:54676 0   54676   T   C
1 1:54676b 0 54676 A G
1   1:86028 0   86028   C   T
1 1:86028b 0 86028 T G
1 1:86028c 0 86028 A G
1   1:91536 0   91536   T   G

另一个
awk
可以让您控制附加的代码

$ awk -v codes="$(echo {b..z})" 'BEGIN{split(codes,s)} 
                                      {$2=$2 s[c[$2]++]}1' file | column -t

1  1:49298   0  49298  T  C
1  1:54676   0  54676  T  C
1  1:54676b  0  54676  A  G
1  1:86028   0  86028  C  T
1  1:86028b  0  86028  T  G
1  1:86028c  0  86028  A  G
1  1:91536   0  91536  T  G

另一个
awk
可以让您控制附加的代码

$ awk -v codes="$(echo {b..z})" 'BEGIN{split(codes,s)} 
                                      {$2=$2 s[c[$2]++]}1' file | column -t

1  1:49298   0  49298  T  C
1  1:54676   0  54676  T  C
1  1:54676b  0  54676  A  G
1  1:86028   0  86028  C  T
1  1:86028b  0  86028  T  G
1  1:86028c  0  86028  A  G
1  1:91536   0  91536  T  G
或perl:

perl -lane '
    $F[1] .= chr(96 + $count{$F[1]}) if $count{$F[1]}++ > 0;
    print join "\t", @F
' file
或perl:

perl -lane '
    $F[1] .= chr(96 + $count{$F[1]}) if $count{$F[1]}++ > 0;
    print join "\t", @F
' file

你试过什么,怎么会失败?Perl是一种选择吗?(它有一个方便的功能,
$x=“a”+$x
导致
$x
包含字符串“b”。)第27次出现时应该添加什么?第53次怎么样?你试过什么,怎么失败的?Perl是一种选择吗?(它有一个方便的功能,
$x=“a”+$x
导致
$x
包含字符串“b”。)第27次出现时应该添加什么?53号怎么样?