awk if else循环中的计数器

awk if else循环中的计数器,awk,Awk,你能给我解释一下为什么这个简单的在线服务不起作用吗?谢谢你抽出时间 awk 'BEGIN{i=1}{if($2 == i){print $0} else{print "0",i} i=i+1}' check 输入名为“检查”的文本文件: 期望输出: 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 在else中再增加一次i(插入新行) 在else中也打印当前行 仅当当前行之间仅缺少一行时,此操作才有效,否则需要循环打印缺

你能给我解释一下为什么这个简单的在线服务不起作用吗?谢谢你抽出时间

awk 'BEGIN{i=1}{if($2 == i){print $0} else{print "0",i} i=i+1}' check
输入名为“检查”的文本文件:

期望输出:

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
  • 在else中再增加一次
    i
    (插入新行)
  • 在else中也打印当前行
  • 仅当当前行之间仅缺少一行时,此操作才有效,否则需要循环打印缺少的行
或简化:

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

你的坏了是因为:

  • 你读下一行(“e 5”)
  • 2美元不等于你的计数器
  • 打印占位符行并增加计数器(到5)
  • 您不打印当前行
  • 你读下一行(“F6”)
  • 转到2
  • 这里有一个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
    
    您所需要的只是:

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

    awk'{while(++I)是一堆,所以考虑到你的最后一点,我用了“while”而不是“if”。即使少了不止一行,也会很有魅力。谢谢。我几乎没有看你的问题,因为你已经选择了一个答案。如果你发布其他问题,你可能想推迟几个小时,看看你得到的其他答案,因为你得到的第一个答案可能并不总是最好的答案。
    
    awk 'NR==1{p=$2}{while($2>p+1)print "0",++p;p=$2}1' check
    
    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