想象一下,我有一个包含正弦数据的文件,例如
567
568
570
572
但是我想用缺失的索引(569,571)打印出来。
基本上放在丢失的数字中,我已经使用awk来读取文件并为每一行执行操作
(something like awk '{print #the command im doing on the line}' )
那么,有没有办法在awk中做到这一点?我是一个非常新的bash脚本,我试图使用一个ctr变量并将其与行的值匹配,但我正在努力让它工作。 (我不想给我答案,而是可以帮助我实现目标的技巧或功能)
答案 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
:
567
568
570
572
seq 567 572
生成)567
568
569
570
571
572
# 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
我相信你能搞清楚......