gpt4 book ai didi

awk 选择性打印页码

转载 作者:行者123 更新时间:2023-12-02 09:08:36 25 4
gpt4 key购买 nike

我有一个包含要打印的 .pdf 文件页码的字符串,但我想最小化字符串的长度,以便用破折号替换所有连续的数字,以便进行选择性打印awk。有人可以帮我编写 awk 代码吗?

来自

1,3,4,5,6,7,8,9,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53,

进入

1,3-13,15-51,53

最佳答案

这个问题的棘手部分是,在收到下一个值之前,您不知道如何打印前一个值。

这是一个在输入多行输入时可以正常工作的脚本,将每一行视为一组单独的要处理的数字。它完全忽略空字段(前导、相邻或尾随逗号)。它假设每行上的字段都是数字并按升序排序。它实际上不适用于数据中的负数(使用破折号分隔范围的格式变得笨拙 - 但数据是正确的),但它对零很满意。

这不是最紧凑的代码,但我相信清晰度比压缩更重要,特别是当它正确时(如果有必要,优化或压缩稍后进行)。

BEGIN { FS = "," }

function print_range()
{
if (lo == hi)
printf "%s%d", pad, lo
else
printf "%s%d-%d", pad, lo, hi
pad = ","
}

{
lo = ""
hi = ""
pad = ""
for (i = 1; i <= NF; i++)
{
if ($i == "") # Ignore empty fields - could report them
continue
else if (lo == "")
hi = lo = $i
else if ($i == hi + 1)
hi = $i
else
{
# Previous range complete - print it
print_range()
lo = hi = $i
}
}
print_range()
print ""
}

我使用了包含上述代码的文件 script.awk,并调用 awk -f script.awk data* 来生成如下所示的输出。

这里是一些示例数据(紧密基于问题中的数据):

1,3,4,5,6,7,8,9,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53,
1,3,4,5,6,7,8,9,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53
1,3,4,5,6,7,8,9,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53
3,4,5,6,7,8,9,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53
3,4,5,6,7,8,9,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51

第一行有一个逗号;其他人则不然。第三行及后续行缺少条目 29 和 32,因此数据中存在 2 元素范围 30-31。最后两行在开头有一个多元素范围而不是单个项目;最后一行的末尾有一个多元素范围而不是单个项目。

脚本的输出是:

1,3-9,11-13,15-51,53
1,3-9,11-13,15-51,53
1,3-9,11-13,15-28,30-31,33-51,53
3-9,11-13,15-28,30-31,33-51,53
3-9,11-13,15-28,30-31,33-51

可以很容易地调整打印来检测 hi == lo + 1 并决定打印逗号分隔的值而不是破折号分隔的值(如果这是首选)。

关于awk 选择性打印页码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55102385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com