特定の列の単語が式と一致しない場合は、どのように変更できますか?

特定の列の単語が式と一致しない場合は、どのように変更できますか?

次のファイルがあります。

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が正規表現と一致しない場合は、に^[pm]iRNA設定してから、rfam変更したかどうかに関係なくその行を印刷します。

注:一貫した出力を保証するために、出力フィールド区切り記号(OFS)をタブに設定し、印刷ステートメントの$4 = $4前に追加しました(これにより、出力行のフィールド区切り文字がOFSに変更される副作用があります)。それ以外の場合、変更された行はOFSがデフォルト値(単一スペース)として指定されていますが、変更されていない行は元のファイルの内容と同じままであるため、cat端末で使用または表示したときに列が正しくソートされない可能性があります。どの。

関連情報