如何在这种情况下使用Awk

时间:2014-09-08 14:43:24

标签: linux bash shell awk

如何更改此文件

335
339
666665
666668

到这个结果

335
336
337
338
339
666665
666666
666667
666668

解释:在两个长度相同的数字之间,它会将错过的数字推到数字升序。很多谢谢

2 个答案:

答案 0 :(得分:6)

我相信这可以做你想要的。

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的长度,并在我们处理缺失范围时(a为与i - 1)相同,因此我们不会复制该数字(这会处理335339350等连续行的情况,而不会重复339 1}})。

为@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

答案 1 :(得分:3)

第一种方法是:

$ awk 'NR%2 {a=$1; next} $1>a {for (i=a;i<=$1;i++) print i}' file
335
336
337
338
339
666665
666666
666667
666668

它可以在您提出的问题中提供的信息和努力得到改善:)

解释

  • NR%2 {a=$1; next}由于NR代表n r ecord(本例中为行数),如果NR不是多个,则NR%2为1这样就将变量a中的行值存储在奇数行中。然后,next停止处理当前行。
  • $1>a {for (i=a;i<=$1;i++) print i}在其他情况下(偶数行),如果该值大于存储的值,则从该值循环到当前值,打印其间的所有值。