2016-02-28 87 views
0

你能向我解釋爲什麼這個簡單的onliner不起作用嗎?謝謝你的時間。與名稱在awk中的計數器if if loop

awk 'BEGIN{i=1}{if($2 == i){print $0} else{print "0",i} i=i+1}' 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 

回答

0
awk 'BEGIN{i=1}{ if($2 == i){print $0; } else{print "0",i++; print $0 } i++ }' check 
  • 增量i一個更多的時間在別人(要插入一個新行)
  • 打印在其他的currentline,太
  • 如果只有一個行本線之間缺少此工作而已,否則你需要一個循環打印缺少的行

或簡化:

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

多謝,所以服用考慮到你的最後一點,我用「while」而不是「if」。像魅力一樣工作,即使缺少多條線。 – origamisven

0

你的是打破,因爲:

  1. 你讀下一行( 「E 5」),
  2. $ 2不等於你的櫃檯,
  3. 打印佔位線,並增加你的計數器(5),
  4. 做不打印當前行
  5. 你讀下一行( 「F 6」)
  6. 轉到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 
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 
+1

這很美麗。 – origamisven

+0

謝謝。我幾乎沒有看到你的問題,因爲你已經選擇了答案。如果你發佈其他問題,你可能需要等上幾個小時,看看你得到的第一個答案是什麼,可能並不總是最好的答案。 –