範囲リストに関連付けられた変数を整数を含む別のテーブルに割り当てる方法

範囲リストに関連付けられた変数を整数を含む別のテーブルに割り当てる方法

1から6kまでの整数リストと、その範囲内の各整数に割り当てたい3番目の値を含む範囲(開始/停止)のリストがあります。スコープのリストは次のようになりますが、実際にはすべての整数を確認するためにファイルごとに数百のユニークなスコープがあります。

5277 5305 72

5306 5331 50

5332 5361 57

5368 5389 55

私が望むのは、範囲テーブルの3番目の列にある整数と値を印刷するか、どの範囲にも属さない整数に対して「0」を印刷することです。

1 0

2 0

3 0

...

5277 72

5278 72

5279 72

...

5305 72

5306 50

5307 50

...

6000 0

予想される結果を得る方法についてのアイデアはありますか? 1から6000の間の整数に対して「for」ループを作成し、「if」ファイルを挿入して各範囲の各整数を確認しようとしています。しかし、単にこれを変更するために何百もの個別の「if」ステートメントを書くことはしたくありません。以下はデータセットです。たぶんMySQLで範囲テーブルを作成し、そのテーブルの6000個の値をそれぞれチェックして結果を印刷することができますが、私はMySQLに慣れていないので、それを見つけるのに時間がかかります。

ベストアンサー1

これは少し複雑ですが、少なくともSQLを使用する必要はありません。 「range」というファイルのサンプル範囲を使用します。

seq 6000 > integers
awk '{print $1","$2"{s/\\(.*\\)/\\1 "$3"/; t\n}" } END { print "s/\\(.*\\)/\\1 0/" }' range > range.sed
sed -f range.sed integers > integers.output

これにより、数値1..6000の整数ファイルが生成され、awkを使用して範囲ファイルを一連のコマンドsedに変換し、すべてのコマンドをsedスクリプトファイル(range.sed)にリダイレクトします。次に、このsedスクリプトファイルを使用して整数入力に対してsedを呼び出し、それを出力ファイルにリダイレクトします。

awkスクリプトは2つの基本的な操作を実行します。

  1. 2つのコマンドブロックを使用して「開始、停止」範囲を印刷します(範囲ファイルの最初と2番目のフィールドを使用)。

    ㅏ。 sed検索を印刷し、「anything on line」コマンドを「anything before」と範囲ファイルの3番目の列に置き換えます。

    b。交換が成功したら、sedスクリプトの最後に分岐します(したがってsedスクリプトの最後の部分をバイパスします)。

  2. sedスクリプトの最後のコマンド(すべての範囲の入力が終わった後)で、sed検索と置換コマンドを印刷して、その行のすべての値をその値の後にゼロに置き換えます。

これにより、多くのハードコーディングされたロジックを更新することなく、必要に応じて範囲および/または整数ファイルを更新することができるかなりの柔軟性が得られます。

おすすめ記事