2016-03-01 54 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標準不要求這樣做。