如果特定列中的单词与表达式不匹配,如何替换它?

如果特定列中的单词与表达式不匹配,如何替换它?

我有以下文件:

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 之外的任何单词。

答案1

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

这正是您所要求的 - 如果字段 4 与 regexp 不匹配^[pm]iRNA,请将其设置为rfam.然后打印该行,无论它是否被更改。

注意:我已将输出字段分隔符 (OFS) 设置为选项卡以确保输出一致,并$4 = $4在 print 语句之前添加(这具有导致输出行中的字段分隔符更改为 OFS 的副作用) -否则,已更改的行将以 OFS 作为默认值(单个空格),而未更改的行将与原始文件中的内容保持不变,这可能会导致在使用cat或在终端中查看时,列无法正确排列。任何。

相关内容