所以假设我有一个包含正弦数据的文件,比如
567
568
570
572
但是我想把缺少的索引(569,571)打印出来。
实际上,我已经在使用awk读取文件并对每一行执行一个操作
(something like awk '{print #the command im doing on the line}' )
那么,有没有办法让我在awk内部完成这项工作?我对bash脚本编程非常陌生,我试图使用ctr变量并将其与行的值进行匹配,但我一直在努力使其正常工作。(我不想让别人给我答案,而是希望能帮助我实现目标的技术或功能)
发布于 2014-03-27 10:22:28
以下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,因此我们必须跳过第一行的间隙检查,条件的一部分并不是严格需要的,因为操作中的for
循环隐式地强制执行相同的条件,但为清楚起见,我添加了它。发布于 2014-03-27 09:02:10
您可以使用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
发布于 2014-03-27 12:33:16
抱歉,写起来比告诉你怎么写要容易得多:
$ awk '!s{s=$0} {e=$0} END{for (i=s;i<=e;i++) print i}' file
567
568
569
570
571
572
我相信你能弄明白的.
https://stackoverflow.com/questions/22676197
复制相似问题