linux - 在这种情况下如何使用 awk

标签 linux bash shell awk

如何更改此文件

335
339
666665
666668

这个结果

335
336
337
338
339
666665
666666
666667
666668

解释一下:两个长度相同的数字之间,会将漏掉的数字压入,使数字升序排列。非常感谢

最佳答案

我相信这符合您的要求。

awk 'alen==length($1) {for (i=a;i<=$1;i++) print i}; {a=$1; alen=length(a); if (a==(i-1)) {a++}}'

alen(a的长度)与a$1之间的当前行循环的长度相同时,打印出所有缺失值。

然后将 a 设置为新的 $1,将 alen 设置为 a 的长度,当我们处理缺失范围时(当 ai - 1 相同时),递增 a,这样我们就不会重复该数字(这可以处理诸如 33533935 等连续行的情况0,不重复 339)。

基本思想归功于@fedorqui。

编辑:我相信这解决了我在评论中指出的问题(我认为这也是 @JohnB 所指出的):

awk '{f=0; if (alen==length($1)) {for (i=a;i<=$1;i++) print i} else {f=1}} {a=$1; alen=length(a)} a==(i-1){a++} f{print; a++}'

我觉得应该有一种更简单的方法来做到这一点,但目前我还没有看到。

再次编辑:我最终测试的输入文件:

335
339
340
345
3412
34125
666665
666668

关于linux - 在这种情况下如何使用 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25726941/

相关文章:

linux - Tar 并将结果直接保存到 SSH 目录

string - 复制文件夹名称中的空格时将文件夹名称附加到文件名

linux - 使用 shell 脚本验证设备配置

linux - 每次运行时都调整 Cronjob?

linux - 如何将 ai 转换为 linux 的 cdr

bash - rsync 在哪里保存完整和不完整数据传输的日志文件?

java - 找不到运行 java 类

bash - 如何使用带分隔符 "{##} "的剪切?

bash - 问题理解 bash 脚本中的参数扩展

java - 关于linux IO性能