次のように、多くの列を含む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
10385391
2番目の列を見て、f
見つかったら1に設定します。これにより、f
その行と値が1のすべての行が印刷されます(これはコードf
の末尾で行われますawk
)。 3番目の列に達するたびに、より多くの10385397
行f
を印刷しないように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