添加行某些行未找到BASH

时间:2014-03-27 00:53:38

标签: bash awk

想象一下,我有一个包含正弦数据的文件,例如

567
568
570
572

但是我想用缺失的索引(569,571)打印出来。

基本上放在丢失的数字中,我已经使用awk来读取文件并为每一行执行操作

(something like awk  '{print #the command im doing on the line}' )

那么,有没有办法在awk中做到这一点?我是一个非常新的bash脚本,我试图使用一个ctr变量并将其与行的值匹配,但我正在努力让它工作。 (我不想给我答案,而是可以帮助我实现目标的技巧或功能)

3 个答案:

答案 0 :(得分:2)

以下awk命令处理所有输入行以及连续输入行之间数字间隙所隐含的任何缺失整数:

awk '
  prev > 0 && prev + 1 < $1 {   # Is there a gap between this and the previous no?
    for (i=prev+1; i<$1; ++i) { # Process all numbers in the gap.
      print "filled in: " i
    } 
  } 
  {          
    print "provided: " $1  # Process this number.
    prev=$1                # Remember this number for the next iteration.
  }
  ' input.txt
  • 我使用$1,每行上第一个以空格分隔的字段作为数字。如果你的行不包含其他字段(仅由数字组成),$0 - 整个输入行 - 也会起作用。
  • awk中未初始化的变量默认为0,因此prev - 包含上一个号的变量 - 在处理第一行时为0,因此我们必须跳过差距检查条件为prev > 0的第一行。
  • 条件的&& prev + 1 < $1部分并不是严格需要的,因为动作中的for循环隐含地强制执行相同的条件,但为了清楚起见,我已添加它。

答案 1 :(得分:1)

您可以使用comm

input.txt中

567
568
570
572

all.txt(由seq 567 572生成)

567
568
569
570
571
572

bash命令

# easy way
comm -13 input.txt all.txt
# awk way
awk 'NR==FNR{a[$0];next};$0 in a{next;};1' input.txt all.txt

答案 2 :(得分:1)

很抱歉,但写起来比告诉你怎么写它更容易:

$ awk '!s{s=$0} {e=$0} END{for (i=s;i<=e;i++) print i}' file
567
568
569
570
571
572

我相信你能搞清楚......