我有一个文件(不是制表符分隔)
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遇到很多问题,有没有一种简单的方法可以做到这一点?
答案 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 ~]#