レコード列の特定の文字列に一致を制限する方法は?

レコード列の特定の文字列に一致を制限する方法は?

次の結果を含む2000行のファイルがあります。

> HGNC:24239 |  2   | deleterious_low_confidence(0.01) 
> HGNC:6583  |  1   | deleterious(0.04)

あのラインを手に入れたい有害()いいえ有害_低_信頼()。このコマンドを使用しましたが、うまくいきませんでした。

awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt

誰でも私のコマンドにどのような問題があるのか​​教えてもらえますか?ありがとうございます!

ベストアンサー1

命令を出すには3つの程度がありますが、

awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt

期待どおりに機能しません:

  1. データの入力フィールドの区切り記号はです|。使用しているデフォルトの区切り文字はスペースまたはタブの集まりです。これは、これが各行の最初の文字に$3なることを意味します。|

  2. NR==1それにもかかわらず、コードビットのために最初の行が印刷されます。

  3. 使用した正規表現に式エラーがあります。拡張正規表現では特別なので、(エスケープ)する必要があります。ただし、「文字数制限なし」ともdeleterious\(*\)一致できません。\(*(

|入力フィールド区切り文字として正しく機能するには、awkwithを使用します-F '|'。ただし、この場合は[[:blank:]]*\\|[[:blank:]]*パイプシンボル(存在する場合)の周りのサイドスペース/タブも含めることができます。リテラルパイプ記号にするには、前のバックスラッシュが必要です|。フィールド区切り文字が単一文字より長い場合、正規表現として扱われ、正規表現|内で置き換えられます。式はのテキストのように動作します[[:blank:]]*[|][[:blank:]]*|[...]

3番目のフィールドを一致させるためにdeleterious(<anything>)式を使用できます^deleterious\(.*\)$。括弧は正規表現で特別なので、エスケープする必要があります。または^deleterious[(].*[)]$使用することができます。

これはあなたが使うことを意味します

awk -F '[[:blank:]]*[|][[:blank:]]*' '$3 ~ /^deleterious\(.*\)$/' file1.txt >file2.txt

与えられたデータに基づいてこのように生成されます。

> HGNC:6583  |  1   | deleterious(0.04)

存在するfile2.txt

一つ |フィールド区切り記号として使用できます

awk -F '|' '$3 ~ /^[[:blank:]]*deleterious\(.*\)$/' file1.txt >file2.txt

これにより、3 番目のフィールドの先頭にスペースまたはタブが許可されます。

おすすめ記事