我有一个从 1 到 6k 的整数列表,还有一个范围列表(开始/停止),其中包含我想分配给这些范围内的每个整数的第三个值。范围列表可能看起来像这样,尽管实际上每个文件将有数百个唯一范围来检查每个整数。
5277 5305 72
5306 5331 50
5332 5361 57
5368 5389 55
我想做的是打印范围表第三列中的整数和值,或者为不属于任何范围的整数打印“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 脚本做了两个基本的事情:
使用两个命令块打印“开始,停止”范围(使用范围文件中的第一个和第二个字段):
A。打印出 sed 搜索并用“之前的任何内容”替换“行上的任何内容”命令,后跟范围文件的第三列。
b.如果替换成功,则分支到 sed 脚本的末尾(因此绕过 sed 脚本的最后一部分)
作为 sed 脚本中的最后一个命令(在结束所有范围输入之后),打印出 sed 搜索和替换命令,以将该行上的任何值替换为该值后跟零。
这使您能够相当灵活地根据需要更新范围和/或整数文件,而无需更新大量硬编码逻辑。