计数器在awk if else循环中

时间:2016-02-28 13:29:51

标签: awk

你能解释一下为什么这个简单的在线工作不起作用吗?谢谢你的时间。

awk 'BEGIN{i=1}{if($2 == i){print $0} else{print "0",i} i=i+1}' check

输入名称为“check”的文本文件:

a 1
b 2
c 3
e 5
f 6
g 7

期望的输出:

a 1
b 2
c 3
0 4
e 5
f 6
g 7

收到的输出:

a 1
b 2
c 3
0 4
0 5
0 6

3 个答案:

答案 0 :(得分:0)

i
  • 在else中再次增加awk 'BEGIN{i=1}{ if($2 != i){print "0",i++; } print $0; i++ }' check (您正在插入新行)
  • 也在其他地方打印当前行
  • 只有在当前行之间只缺少一行时才有效,否则你需要一个循环打印缺失的行

或简化:

Encoding('ʘ')

答案 1 :(得分:0)

你们因为:

而被打破
  1. 你读了下一行(" e 5"),
  2. $ 2不等于你的柜台,
  3. 打印占位符行并递增计数器(至5),
  4. 不打印当前行
  5. 您阅读了下一行(" f 6")
  6. 转到2
  7. 这里需要一个while循环 - 当你的间隙大于一个数字时,它也会处理这种情况。

    awk '
        NR == 1 {prev = $2}
        {
            while ($2 > prev+1)
                print "0", ++prev
            print
            prev = $2
        }
    ' check
    

    或者,如果你喜欢难以穿透的单行:

    awk 'NR==1{p=$2}{while($2>p+1)print "0",++p;p=$2}1' check
    

答案 2 :(得分:0)

您只需要:

awk '{while (++i<$2) print 0, i}1' file

查找

$ cat file
a 1
b 2
c 3
e 5
f 6
g 7
k 11
n 14

$ awk '{while (++i<$2) print 0, i}1' file
a 1
b 2
c 3
0 4
e 5
f 6
g 7
0 8
0 9
0 10
k 11
0 12
0 13
n 14