Text-Processing

如果特定列中的單詞與表達式不匹配,如何替換它?

  • February 29, 2016

我有以下文件:

chr1    157784  157887  U6  0   -
chr1    564813  564881  miRNA   0   +
chr1    564879  564950  tRNA    0   -
chr1    564952  565019  tRNA    0   +
chr1    566062  566129  piRNA   0   +
chr1    566137  566205  tRNA    0   -

如果第 4 列中的表達詞不是以“piRNA”或“miRNA”開頭,則替換為“rfam”

預期輸出:

chr1    157784  157887  rfam    0   -
chr1    564813  564881  miRNA   0   +
chr1    564879  564950  rfam    0   -
chr1    564952  565019  fram    0   +
chr1    566062  566129  piRNA   0   +
chr1    566137  566205  rfam    0   -

注意:欄位 4 中會有很多不同的名稱,而不僅僅是 U6 和 tRNA。這需要適用於任何不是 piRNA 或 miRNA 的詞。

awk -v OFS='\t' '$4 !~ /^[pm]iRNA/ { $4 = "rfam" } ; { $4 = $4 ; print }' file

這完全符合您的要求 - 如果欄位 4 與 regexp 不匹配^[pm]iRNA,請將其設置為rfam. 然後列印該行是否已更改。

注意:我已將輸出欄位分隔符 (OFS) 設置為選項卡以確保輸出一致,並$4 = $4在列印語句之前添加(其副作用是導致輸出行中的欄位分隔符更改為 OFS) -否則,已更改的行將使用 OFS 作為預設值(單個空格),而未更改的行將與原始文件中的內容保持一致,這可能會導致在終端中使用cat或查看時列無法正確對齊任何。

引用自:https://unix.stackexchange.com/questions/266410