
次の結果を含む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
期待どおりに機能しません:
データの入力フィールドの区切り記号はです
|
。使用しているデフォルトの区切り文字はスペースまたはタブの集まりです。これは、これが各行の最初の文字に$3
なることを意味します。|
NR==1
それにもかかわらず、コードビットのために最初の行が印刷されます。使用した正規表現に式エラーがあります。拡張正規表現では特別なので、
(
エスケープ)
する必要があります。ただし、「文字数制限なし」ともdeleterious\(*\)
一致できません。\(*
(
|
入力フィールド区切り文字として正しく機能するには、awk
withを使用します-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 番目のフィールドの先頭にスペースまたはタブが許可されます。
答え2
私はお勧めしますfgrep
:
fgrep 'deleterious(' file1.txt > file2.txt
を使用するにはawk
適切な正規表現が必要です。
awk -F '|' '$3 ~ /^ deleterious\(.*\)$/' file1.txt > file2.txt
または
awk -F ' \| ' '$3 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt
または
awk '$6 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt