首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >添加行某些行未找到BASH

添加行某些行未找到BASH
EN

Stack Overflow用户
提问于 2014-03-27 08:53:38
回答 3查看 52关注 0票数 1

所以假设我有一个包含正弦数据的文件,比如

代码语言:javascript
代码运行次数:0
运行
复制
567
568
570
572

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

实际上,我已经在使用awk读取文件并对每一行执行一个操作

代码语言:javascript
代码运行次数:0
运行
复制
(something like awk  '{print #the command im doing on the line}' )

那么,有没有办法让我在awk内部完成这项工作?我对bash脚本编程非常陌生,我试图使用ctr变量并将其与行的值进行匹配,但我一直在努力使其正常工作。(我不想让别人给我答案,而是希望能帮助我实现目标的技术或功能)

EN

回答 3

Stack Overflow用户

发布于 2014-03-27 10:22:28

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

代码语言:javascript
代码运行次数:0
运行
复制
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,因此我们必须跳过第一行的间隙检查,条件的一部分并不是严格需要的,因为操作中的for循环隐式地强制执行相同的条件,但为清楚起见,我添加了它。
票数 2
EN

Stack Overflow用户

发布于 2014-03-27 09:02:10

您可以使用comm

input.txt

代码语言:javascript
代码运行次数:0
运行
复制
567
568
570
572

all.txt (由seq 567 572生成)

代码语言:javascript
代码运行次数:0
运行
复制
567
568
569
570
571
572

bash命令

代码语言:javascript
代码运行次数:0
运行
复制
# 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
票数 1
EN

Stack Overflow用户

发布于 2014-03-27 12:33:16

抱歉,写起来比告诉你怎么写要容易得多:

代码语言:javascript
代码运行次数:0
运行
复制
$ awk '!s{s=$0} {e=$0} END{for (i=s;i<=e;i++) print i}' file
567
568
569
570
571
572

我相信你能弄明白的.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22676197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档