文書:
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
利用可能なgrep
PCREツール。ここでは、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
-n
Perlに、infileを一度に1行ずつ処理し、各行をで指定されたコマンドに渡すように指示します-e
。-a
Perlに、フィールド区切り文字(デフォルトでは空白)の周りの各行を展開し、それを名前付き配列に割り当てるように指示します@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