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つの基本的な操作を実行します。
2つのコマンドブロックを使用して「開始、停止」範囲を印刷します(範囲ファイルの最初と2番目のフィールドを使用)。
ㅏ。 sed検索を印刷し、「anything on line」コマンドを「anything before」と範囲ファイルの3番目の列に置き換えます。
b。交換が成功したら、sedスクリプトの最後に分岐します(したがってsedスクリプトの最後の部分をバイパスします)。
sedスクリプトの最後のコマンド(すべての範囲の入力が終わった後)で、sed検索と置換コマンドを印刷して、その行のすべての値をその値の後にゼロに置き換えます。
これにより、多くのハードコーディングされたロジックを更新することなく、必要に応じて範囲および/または整数ファイルを更新することができるかなりの柔軟性が得られます。