2016-03-01 56 views
0

我正在寻找一个in place命令更改与:.:.在一条线组合两个sed命令

chr01 1453173 . C T 655.85 PASS . GT:AD:DP:PGT:PID 0/1:25,29:54:.:. 

最终要

chr01 1453173 . C T 655.85 PASS . GT:AD:DP 0/1:25,29:54 

在单词的所有文件中的行,我基本上从任何以:.:.结尾的行删除:PGT:PID:.:.

回答

1

随着GNU的sed和Solaris的sed:

sed '/:\.:\.$/{s///;s/PGT:PID//;}' file 

如果你想编辑与GNU文件的sed “到位” 使用选项-i

+0

Toby Speight,感谢您的编辑。 – Cyrus

1

您正在寻找的东西,如:

sed -i.bak "/^.*:\.:\.$/ {s/:PGT:PID//g; s/:\.:\.//g;}" file 
  • 它并就地用文件替换,并创建一个备份作为file.bak
  • /^.*:\.:\.$/限制s命令来在:.:..需要结束行因为它们是正则表达式的特殊字符
  • s sommand用空字符串替换字符串
+1

@EdMorton感谢您的建议,我改进了答案。 –

1

使用awk那会是:

awk 'sub(/:\.:\.$/,""){sub(/:PGT:PID/,"")} 1' file 
chr01 1453173 . C T 655.85 PASS . GT:AD:DP 0/1:25,29:54 

和就地与gawk的编辑,你可以添加-i inplace选择,而与任何awk的,你可以再补充> tmp && mv tmp file

1

作为一个班轮:

sed -i -e '/:\.:\.$/!n' -e 's///' -e 's/:PGT:PID//g' "$file" 

扩展:

/:\.:\.$/!n  # leave lines untouched unless they end in ":.:." 
s///   # replace the matched ":.:." with nothing 
s/:PGT:PID//g # replace ":PGT:PID" with nothing, everywhere 

我们使用-i标志进行就地编辑。为便于携带,我们将每行作为单独的-e表达式进行传递:某些sed实现允许将几个命令与;级联,但POSIX标准不要求这样做。