如何使用sed或awk将字符串添加到.txt文件中的所有行中,除了少数字符外


8

我有一个名为的文本文件xid.txt

xid: SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: SC32173 id: artf398402
xid: SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

我需要在'SC48028','SC32173'...之前添加字符串'PT_'。字符串“ SC ...”可以任何组合开头,可以是“ AC ...”或“ DL ..”

要求的输出:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

如果看到上面的输出,我们不应在以'i','p','w'和'numerical'开头的字符串之前插入'PT_'。我已经使用sed中的insert / append尝试了一些基本命令来满足我的要求。


2
您的问题与主题有关,在这里欢迎您,但您可能对我们新的生物信息学站点感兴趣。
terdon

Answers:


13

awk

awk '$2~/^[A-Z][A-Z]/{ $2="PT_"$2 }1' xid.txt

输出:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

  • $2~/^[A-Z][A-Z]/ -如果第二个字段以2个大写字母开头

sed方法:

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt

这是如此顺利,即时答复非常感谢。如果我想在现有输入文件中追加内容,应该怎么做?
Subrat Sahoo

awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txt或使用我的第二种方法
RomanPerekhrest

1
@SubratSahoo如果此答案解决了您的问题,请花一点时间并单击左侧的复选标记以接受。这会将问题标记为已回答,并且是在Stack Exchange网站上表达感谢的方式。
terdon

1
另外,@ SubratSahoo(和罗马)的GNU的较新版本awk(通常在Linux系统上安装的版本)具有-i inplace允许您就地编辑文件的文件,如sed和perl的-i
terdon

@terdon,是的,我知道-i inplace(我mv为OP 建议了一种统一的命令方法,以适合可移植性)。至于Bioinformatics beta社区:我刚刚加入。会有与Linux / Python编程/处理相关的任务吗?你怎么想?
RomanPerekhrest

6

sed选项

sed -i -e 's/[A-Z][A-Z]/PT_&/' file

哪里

  • -i 就地编辑
  • -e 执行命令
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.