特定の条件でファイルから行を抽出する方法

特定の条件でファイルから行を抽出する方法

文書:

chromosome  position  ref  alt 
chr1          1398     A    T 
chr1          2980     A    C 
chr2          3323     C    T,A
chr2          3749     T    G
chr3          5251     C    T,G
chr3          9990     G    C,T
chr4          10345    T    G 

列4にカンマ区切り文字が2つ以上ある場合は、行全体を抽出する必要があります。

予想される出力は次のとおりです。

chr2          3323     C    T,A
chr3          5251     C    T,G
chr3          9990     G    C,T 

答え1

この問題を見るにはいくつかの方法があります。

方法1

カンマで区切られた文字が 2 つ以上含まれている行にのみ興味があるので、grepカンマを使用するだけです。

$ grep "," sample.txt 
chr2          3323     C    T,A
chr3          5251     C    T,G
chr3          9990     G    C,T

方法#2

利用可能なgrepPCREツール。ここでは、grepマッチングのためにPerlの正規表現エンジンを使用できます。これは非常に強力で、Perlでできることをたくさんすることができますgrep

緩く定義された

$ grep -P "(\w,)+" sample.txt 

厳格な定義

$ grep -P '\w+\d\s+\d+\s+\w\s+(\w,)+' sample.txt 

方法#3

使用awk。これはコンマ()がある行だけが意味があるという事実を再利用するので、その,行を見つけて印刷します。

緩く定義された

$ awk '/,/{print}' sample.txt 

より厳格な定義

$ awk '/([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt 

より厳格な定義

$ awk '$4 ~ /([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt

このコマンドは、4番目の列の内容を見て、文字、カンマ、または別の文字であることを確認します。

より厳格な定義

$ awk '$4 ~ /([GATC])+,[GATC]/{print}' sample.txt 

これはG、A、T、またはCのみを探し、その後にカンマが続き、別のG、A、T、またはCが続きます。

答え2

perl -ane 'print if($F[3] =~ /^\w,\w/$);' file

-nPerlに、infileを一度に1行ずつ処理し、各行をで指定されたコマンドに渡すように指示します-e-aPerlに、フィールド区切り文字(デフォルトでは空白)の周りの各行を展開し、それを名前付き配列に割り当てるように指示します@F。その結果、各行を処理し、それを使用して$F[n]行のn番目の要素を参照できます。

$F[3]次に、フィールド4に文字列の先頭^、単語文字\w、カンマ、他の単語文字、\w文字列の終わりが含まれているかどうかをテストします$。成功するとprintオフライン状態です。

これらの「単語文字」が常にシトシン、アデニン、グアニン、およびチミンである場合は、以下を使用してより明確にすることができます。

perl -ane 'print if($F[3] =~ /^[GATC],[GATC]$/);' file

答え3

別のawkソリューション。

awk 'length($4) > 2 && $4 ~ /^([^,],)+[^,]$/' file_name

テストにはnawkを使用し、gawkで使用することもできます。これはA、T、G、C、Z、Q、Rと一致します。

同様にATGCと一致する場合:

awk 'length($4) > 2 && $4 ~ /([ATGC],)+[ATGC]/' file_name

答え4

簡単なawk文章:

awk '$4 ~ ","' file

関連情報