grepはピリオドを含む正確な単語の一致を探します。

grepはピリオドを含む正確な単語の一致を探します。

.csv次の形式の大容量ファイルがあります。

"acc","lineage"
"MT993865","B.1.509"
"MW483477","B.1.402"
"MW517757","B.1.2"
"MW517758","B.1.2"
"MW592770","B.1.564"
...

accession_idつまり、最初の列はデータサンプルを表す文字列で、2番目の列はcovidの亜種ですlineage。私はaccession_idsとその系譜を抽出することによって興味のある特定のバリエーション、OmicronすなわちB.1.1.529。私はファイルを見つけるためにgrepingを試しましたが、-w単語.ではない文字のために拡張されたomicronバリアントの結果が得られました。例えば、B.1.1.529.1

~のため詳細議論のために私が書いた後、bashスクリプトを見てください。

# filter data based on the selected lineages (refer to variants_lineage.txt for more info) as given below.

# File with metadata
metadata_file="$HOME/thesis/SARS-CoV2-data/metadata.csv"
cat "$metadata_file" | tr -d '"' | tr ',' $'\t' > adj_metadata.tsv

# list of lineages of interest
selected_lineages=("B.1.1.7" "B.1.351" "P.1" "B.1.617.2" "B.1.1.5290" "C.37" "B.1.621" "B.1.429" "B.1.427" "CAL.20C" "P.2" "B.1.525" "P.3" "B.1.526" "B.1.617.1" )
pattern=$(echo ${selected_lineages[*]}|tr ' ' '|')

if [ -f "adj_metadata.tsv" ]
then
  echo "File exists"
  for lineage in ${selected_lineages[@]}
    do
      echo "Filtering for lineage $lineage"
      grep -w "$lineage" adj_metadata.tsv >> filtered_metadata.tsv
    done
else
  echo "Adjusted metadata file does not exist."
fi

# Check for the uniqueness of the filtered_metadata.csv file, this should fetch the list of selected_lineages
cut -d$'\t' -f2 filtered_metadata.tsv | sort | uniq

どんな提案や意見でも大変感謝いたします。

また、質問に関係のない改善事項について自由にご意見をお寄せください。

よろしくお願いします。

ベストアンサー1

方法1

.csvの文字列は常に二重引用符の間にあるため、一致に引用"符を含めることができます。その後、式'に一重引用符を使用します。

例:

asdf.csv:

"foo","B.1.1.529"
"bar","B.1.1.529.1"
╰─$ grep  '"B.1.1.529"' ./asdf
"foo","B.1.1.529"

ご覧のとおり、B.1.1.529.1この場合は一致するものはありません。


方法2

方法1は入力データに対して機能しますが、adj_metadata.tsvすべての引用符を削除するので。もちろん、最初に一致するようにスクリプトを変更してから出力をパイプすることもできますが、これtrには不要な操作が含まれます。

あなたができることは、正規表現を行末に固定することです。$

例:

adj-metadata.tsv:

foo     B.1.1.529
bar     B.1.1.529.1
╰─$ grep "B.1.1.529$" adj_metadata.tsv
foo     B.1.1.529

この方法では、スクリプトを修正する必要がある唯一の修正は、\$grepコマンドの正しい場所に追加することです。

#!/bin/bash
# filter data based on the selected lineages (refer to variants_lineage.txt for more info) as given below.

# File with metadata
metadata_file="$HOME/thesis/SARS-CoV2-data/metadata.csv"
cat "$metadata_file" | tr -d '"' | tr ',' $'\t' > adj_metadata.tsv

# list of lineages of interest
selected_lineages=("B.1.1.7" "B.1.351" "P.1" "B.1.617.2" "B.1.1.5290" "C.37" "B.1.621" "B.1.429" "B.1.427" "CAL.20C" "P.2" "B.1.525" "P.3" "B.1.526" "B.1.617.1" )

#replace all occurrences of "." with "\."
selected_lineages=$(echo $selected_lineages | sed 's/\./\\./g')

if [ -f "adj_metadata.tsv" ]
then
  echo "File exists"
  for lineage in ${selected_lineages[@]}
    do
      echo "Filtering for lineage $lineage"
      grep -w "$lineage\$" adj_metadata.tsv >> filtered_metadata.tsv
    done
else
  echo "Adjusted metadata file does not exist."
fi

# Check for the uniqueness of the filtered_metadata.csv file, this should fetch the list of selected_lineages
cut -d$'\t' -f2 filtered_metadata.tsv | sort | uniq

注:通常はすべての文字の式として使用されますが、リテラルを検索するには、次のように.aにエスケープする必要があります。\.B\.1\.1\.529$

\入力中に単純化のために使用しないままにすることができます。

おすすめ記事