txtファイル内の異なる列の2つの特定の値の間に行を取得する[閉じる]

txtファイル内の異なる列の2つの特定の値の間に行を取得する[閉じる]

次のように、多くの列を含むtxtファイルがあり、2番目の列位置と3番目の列位置の間に含まれる行を取得する必要があります。

1       10385389        10385390        .       21
1       10385390        10385391        .       22
1       10385391        10385392        .       22
1       10385392        10385393        .       21
1       10385393        10385394        .       22
1       10385394        10385395        .       25
1       10385395        10385396        .       25
1       10385396        10385397        .       25
1       10385397        10385398        .       25
1       10385398        10385399        .       25

たとえば、10385391から10385397までの出力を選択したとします。

1       10385391        10385392        .       22
1       10385392        10385393        .       21
1       10385393        10385394        .       22
1       10385394        10385395        .       25
1       10385395        10385396        .       25
1       10385396        10385397        .       25

ボーナス:同様に重要なのは、開始位置が見つからない場合は代わりに終了位置を見つけることです。提供された例では関連シリーズがあるため、これは発生しませんが、次のようなファイルを受け取った場合

1       10385389        10385390        .       21
1       10385391        10385392        .       22
1       10385392        10385393        .       21
1       10385393        10385394        .       22

私が避けたいエラーは、ユーザーが10385390と入力しましたが、2番目の列に見つからないことです。

答え1

開始および停止条件はAWKで直接処理できます。

awk '$2 == "10385391",$3 == "10385397"'

これにより、2番目のフィールド「10385391」のある行で始まり、3番目のフィールドが「10385397」のある行で終わるすべての行が出力されます。

より柔軟な条件を処理するために、1 番目と 2 番目のフィールドの値が 10385391 から 10385397 の間の行を検討できます。

awk '$2 >= 10385391 && $3 <= 10385397'

入力に一致する行の複数のセットが含まれている場合は、すべて出力されます。

答え2

注文する

 awk '$2 == "10385391" { f=1 } $3 == "10385397" { f=0; print }; f' filename

103853912番目の列を見て、f見つかったら1に設定します。これにより、fその行と値が1のすべての行が印刷されます(これはコードfの末尾で行われますawk)。 3番目の列に達するたびに、より多くの10385397fを印刷しないように0にリセットされ、現在の行が印刷されます。

出力

1       10385391        10385392        .       22
1       10385392        10385393        .       21
1       10385393        10385394        .       22
1       10385394        10385395        .       25
1       10385395        10385396        .       25
1       10385396        10385397        .       25

答え3

awk -v begin=10385390 -v end=10385397 '($2 >= begin && $2 <= end) || ($3 >= begin && $3 <= end) || (begin <= $2 && end >= $3)' file

[$2,$3]その範囲が指定された範囲と重なるすべての行を返します[begin,end]

指定されたデータに対して以下が返されます。

1       10385389        10385390        .       21
1       10385390        10385391        .       22
1       10385391        10385392        .       22
1       10385392        10385393        .       21
1       10385393        10385394        .       22
1       10385394        10385395        .       25
1       10385395        10385396        .       25
1       10385396        10385397        .       25
1       10385397        10385398        .       25

[$2,$3]範囲のみ取得~へ与えられた[begin,end]範囲:

awk -v begin=10385390 -v end=10385397 '$2 >= begin && $3 <= end' file

関連情報