最初のフィールドでフィルタリングする必要がある大容量ファイルがあります(繰り返しません)。例は次のとおりです。
NC_056429.1_398 2 3 0.333333 0.333333 0.333333 0.941178
NC_056429.1_1199 2 0 0.333333 0.333333 0.333333 0.941178
NC_056442.1_7754500 0 3 0.800003 0.199997 0.000000 0.000001
NC_056442.1_7754657 1 2 0.000000 0.199997 0.800003 0.888891
NC_056442.1_7754711 2 0 0.888891 0.111109 0.000000 0.800002
NC_056442.1_7982565 0 1 0.800003 0.199997 0.000000 0.666580
NC_056442.1_7982610 1 0 0.800003 0.199997 0.000000 0.000000
NC_056442.1_7985311 2 0 0.888891 0.111109 0.000000 0.000000
awkを使用してシェルスクリプトの最初の列に基づいてファイルをフィルタリングしようとしていますが、whileループにあるため、変数を使用する必要があります。 whileループはテキストファイルを呼び出します。たとえば、次のようになります。
NC_056442.1 7870000 # 1st field = $chrname, 2nd field = $pos
NC_056443.1 1570000
以前は、スクリプトでは、次のように$ startposと$ endposを取得するための目標値を見つけるために$ pos計算を使用していました。
chrname="NC_056442.1" # column 1 in pulled file
startpos=7754657 # calculated in prior script
endpos=7982610 # calculated in prior script
start=${chrname}_${startpos} # this was an attempt to simplify the awk command
end=${chrname}_${endpos}
awk -v s="$start" -v e-"$end" '/s/,/e/' file.txt > cut_file.txt
下の図のように手動で値を入力すると、5〜8行だけを含むファイルが表示されます。
awk '/NC_056442.1_7754657/,/NC_056442.1_7982610/' file.txt > cut_file.txt
結果ファイル
NC_056442.1_7754657 1 2 0.000000 0.199997 0.800003 0.888891
NC_056442.1_7754711 2 0 0.888891 0.111109 0.000000 0.800002
NC_056442.1_7982565 0 1 0.800003 0.199997 0.000000 0.666580
NC_056442.1_7982610 1 0 0.800003 0.199997 0.000000 0.000000
s変数とe変数を実際に操作する方法がわからないため、問題が発生しています。 「ENVIRON[]」を含むさまざまなオプションを試しました。 Bashに初めてアクセスし、ここに最初の投稿を投稿するので、この問題を解決する方法がわかりません。私はawk以外の答えに開いています。質問を編集したり、さらに情報を追加する必要がある場合はお知らせください。
ベストアンサー1
正規表現を一致させてこれを実行しようとしないでください。代わりに、_
awkのフィールド区切り文字として、またはスペースを使用すると、使いやすい変数から染色体と位置を取得できます。
start=1234567
end=7654321
awk -v s="$start" -v e="$end" -F '[ _]' '$3 >= s && $3 <= e' file.txt > cut_file.txt
また、シェルスクリプトで変数名に大文字を使用しないでください。通常、グローバル環境変数は大文字であるため、独自の変数に大文字を使用すると、命名の競合が発生し、エラーを見つけるのが難しい場合があります。
現在使用中のループを表示していません。それが何であれ、シェルではなくawk自体からループする方が良いです。シェルループは遅い。