【问题标题】:How to use Awk in this situation在这种情况下如何使用 awk
【发布时间】:2014-09-09 00:09:22
【问题描述】:

如何更改此文件

335
339
666665
666668

到这个结果

335
336
337
338
339
666665
666666
666667
666668

说明:在两个相同长的数字之间,它会推动错过的数字使数字升序。非常感谢

【问题讨论】:

  • 它总是两个相同长度的数字块吗?到目前为止,您尝试过什么?
  • 339666665 之间的记录呢?
  • same long 的意思可能是same length
  • @YOU 你想要的输出好吗?我看到你想要打印666669,而文件包含666668
  • 令人失望的是,自从询问same question yesterday(自编辑以来)以来,您没有尝试自己解决这个问题。

标签: linux bash shell awk


【解决方案1】:

我相信这可以满足您的需求。

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设置为新的$1alen设置为a的长度,并且当我们处理缺失的范围时(当ai - 1相同时)增加一个so我们不会复制那个数字(这可以处理像335339350 这样的连续行的情况,而不会复制339)。

感谢@fedorqui 的基本想法。

编辑:我相信这解决了我在 cmets 中指出的问题(我认为这也是 @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 可以添加 1 以打印不匹配的行而不增加增量。例如123 后跟 1234 的行。
  • @JohnB 我不确定我是否完全遵循该建议,但它确实带来了一个问题。如果有给定长度的单行,则此答案根本不会打印出来。
  • @JohnB 我想你可能是这个意思,但不能确定。问题在于它会重复打印范围的开始和结束。
【解决方案2】:

第一种方法是这样的:

$ 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} as NR 代表nnumber of record(在这种情况下为行数),如果 NR 不是 2 的倍数,NR%2 为 1。所以这会将行的值存储在奇数行中的变量a。然后,next 停止处理当前行。
  • $1&gt;a {for (i=a;i&lt;=$1;i++) print i} 在其他情况下(偶数行),如果值大于存储的值,它会从该值循环到当前值,并打印其间的所有值。

【讨论】:

  • @YOU 添加了一些信息。下次尝试添加一些尝试!
  • 实际上需要进一步调整。如果最后一条记录是666669666668 之后,则不打印。
  • @anubhava 真的!刚刚在问题中添加了评论以澄清。鹰眼:)
  • 我的意思是这个。在输入文件中的339 下方添加340,然后再次运行此脚本。
  • @anubhava 我正在写一个更新,但现在我看到 Etan Reisner 刚刚为这个案例发布了一个很好的解决方案。我假设输入是一对值,因此是NR%2。但他的方法更通用,更适合更通用的解决方案。为他 +1!
猜你喜欢
  • 2022-01-23
  • 2015-11-30
  • 2017-05-16
  • 2012-10-06
  • 2011-05-18
  • 2019-11-29
  • 2022-01-23
  • 2018-05-20
  • 2013-02-25
相关资源
最近更新 更多