如何在bash中使用特定字符串为所有单词添加数字?

时间:2017-05-30 13:04:08

标签: bash

我有一个文件(不是制表符分隔)

chr22   bed2gff .   16850754    16850929     1000   .   .   .;
chr22   bed2gff .   17556275    17556923     864    .   .   .;
chr22   bed2gff .   17558078    17558342     642    .   .   .;
chr22   bed2gff .   17558390    17558813     941    .   .   .;
chr22   bed2gff .   17558918    17559181     698    .   .   .;
chr22   bed2gff .   17565343    17566824     542    .   .   .;
chr22   bed2gff .   17565448    17565617     603    .   .   .;

我希望文件的方式如下:

chr22   bed2gff1    .   16850754    16850929     1000   .   .   .;
chr22   bed2gff2    .   17556275    17556923     864    .   .   .;
chr22   bed2gff3    .   17558078    17558342     642    .   .   .;
chr22   bed2gff4    .   17558390    17558813     941    .   .   .;
chr22   bed2gff5    .   17558918    17559181     698    .   .   .;
chr22   bed2gff6    .   17565343    17566824     542    .   .   .;
chr22   bed2gff7    .   17565448    17565617     603    .   .   .;

因此“bed2gff”在每一行都是唯一的

我仍然是bash的初学者,我使用awk和sed遇到很多问题,有没有一种简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:0)

awk -v postvar=1  '{$2=$2 postvar; postvar++}1' input

此处,postvar是一个最初被赋值为1的变量。在awk执行块内,第二列与postvar合并,然后是{{1}的值增加。

或使用postvar的另一种方法:

awk

此处,awk -v postvar=1 '{gsub($2,"&"postvar,$2);postvar++}1' inputfile 函数用于将计数器添加到第二列。

PS:您可以使用gsub更改输出格式。

答案 1 :(得分:0)

使用Perl脚本,这很容易解决。让你试试下面的代码:

#!/usr/bin/perl

$^I=".bak";
$,="\t";
my $i=0;
while(<>)
{
     $i++;
     s/(bed2gff)/\1$i/;
     print;
}

请在downvoting之前清除..

答案 2 :(得分:0)

猛击救援。大声笑

[root@cal180 ~]# /bin/cp -f back.dat dat.txt ; bash test.sh dat.txt; cat dat.txt 
complete 6
chr22   bed2gff1 .   16850754    16850929     1000   .   .   .;
chr22   bed2gff2 .   17556275    17556923     864    .   .   .;
chr22   bed2gff3 .   17558078    17558342     642    .   .   .;
chr22   bed2gff4 .   17558390    17558813     941    .   .   .;
chr22   bed2gff5 .   17558918    17559181     698    .   .   .;
[root@cal180 ~]# cat test.sh
#!/bin/bash
i=1;
lc=$(cat $1 | wc -l)
while reptext="bed2gff$i" && [ "$lc" -ge "$i" ] && sed -i "0,/bed2gff /s/bed2gff /$reptext /1" $1 && ((i++)); do :; done;
[root@cal180 ~]#