#CHROM POS T1 T10 T11 T12 T13 T2 T3 T4 T5 T6 T106 T107 T108 T109 T110 T112 T114 T116 T120 T122 T125 T128 T129 T130
Aradu.A01 300806 H B B B B B B B H B B H B B B B B B B B B B B
Aradu.A01 386907 A A A A A A A A A A A A H A A A A A H A A A A
Aradu.A01 463100 B B A A A A A H B A A H H H H H B A B A H H A
Aradu.A01 471639 A A A A H A A H A A H A A A A A H A A A H A A
Aradu.A01 644024 H B B B B B B B H H B H H B B B H B H B B B H
Aradu.A01 756331 H H H H H H H H B B B H H H H H B H H H B B B
Aradu.A01 768081 A A A A A A A A A A A A A A A A A A A A A A A
Aradu.A01 783066 A A H A H H A A A A H A H A A A A A A H A A H
Aradu.A01 812865 H B H H H H H H H H H H H H H H B B H H B B H
Aradu.A01 976731 A H A H H A H H A H H A H H A A H A H A A A H
Aradu.A01 1089311 A H H H H A A A H A H B A H H H H H A A H H H
Aradu.A01 1089991 A A A H A A H A A H A A A A H A A A A A A A H
Aradu.A01 1113781 H H H H H H H A H H H H H H A H H A H A H H H
Aradu.A01 1160441 B B B B B B H B H B B B B B H B B B B B B B B
Aradu.A01 1638873 B H B B H B B B B B B B H H H B B B B B H B B
Aradu.A01 1638907 B H B B H B B B H B B B H H H B B B B B H B B
「A」フィールドと「B」フィールドを含む行のみを取得するawkコードを書くのに役立つ人はいますか?
1)「A」と「H」のみの行、2)「B」と「H」のみの行は考慮されません。
それぞれにAとBの両方が必要です。 A、BとともにHも表示される場合は、その行も考慮する必要があります。要約すると、「A」と「B」を含む行だけが必要です。 「A」と「B」と一緒に「H」が存在する場合は、その行も考慮する必要があります。
NR>1 {for(i=3;i<=NF;i++)
{ if ( $i ~ "A" && $i ~ "B" && $1 ~ "H" ) ;
} ## if ;
## for loop is done
print ;
上記のコードは出力ファイルを入力ファイルとして返します。 }
答え1
スクリプトにはいくつかの問題があります。
- 2つの「A」に一致するフィールドがあるかどうかをテストします。そして同時に「B」。フィールドが単一の文字である場合(したがって「AB」、「BAA」などを取得できない場合)、これは決して真ではありません。
- 見ていて、現れても何でも構わ
H
ないH
- ループを通過するたびに(最初のフィールド)を
H
見つけます。$1
- これらすべてのテストの結果は区別できません。
if
テストに一致する操作はありません。print
各ラインには常にリーチがあります。
トラックAそしてBが同じ行(別のフィールド)に表示されている場合は、それぞれに変数を使用できます。
NR>1 {
#beginning of line - no As or Bs seen yet
A=0
B=0
#looping over all fields except the first two
#break as soon as both A and B found
for(i=3; A*B == 0 && i<=NF; i++) {
if ( $i ~ "A" ) A=1
if ( $i ~ "B" ) B=1
}
#print line if A and B were found
if (A && B) print
}
答え2
これは解決策ではありませんが、awk
次のようにするとgrep
効果があるようです。
egrep '^Aradu\.[A-Z][0-9]{2}.*A.*B|^Aradu\.[A-Z][0-9]{2}.*B.*A' aradu
Aradu.A01 463100 B B A A A A A H B A A H H H H H B A B A H H A
Aradu.A01 1089311 A H H H H A A A H A H B A H H H H H A A H H H
aradu
サンプルファイルはどこにありますか?
編集、正規表現分析:
^Aradu\.[A-Z][0-9]{2}
= "Aradu"で始まり、テキスト "."、大文字、整数が2回出る行。
.*A.*B
=の後に任意の文字(.*
)が続き、その後にリテラル「A」が続き、その後にリテラル「B」が続きます。論理
|
OR。
(表現の先頭が同じになるまで)
.*B.*A
= 任意の文字、回数制限なしで繰り返され、その後にリテラル「B」が続き、その後にリテラル「A」が続きます。
grep
(論理的)演算子がない場合、&&
この行は(私が知っている限り)検索できる最も近い行ですA && B || B && A
。