2017-03-28 50 views
0

awk新手在這裏!我正在尋求幫助來解決一個簡單的特定任務。awk:在文件中搜索缺少的值

這裏是file.txt

1 
2 
3 
5 
6 
7 
8 
9 

正如你可以看到單號(4號)丟失。我想在控制檯上打印缺少的數字4。我的想法是將當前行號與條目進行比較,只要它們不匹配,我就會打印行號並退出。我試過

cat file.txt | awk '{ if ($NR != $1) {print $NR; exit 1} }' 

但它只打印換行符。

我想通過這個小小的練習來學習awk。因此,我主要對使用awk的解決方案感興趣。我也歡迎解釋爲什麼我的代碼不能做我期望的。

+1

的變量'NR',刪除'$'前綴。 – karakfa

+0

不要保留它,如果它讓你困惑,會有其他人... – karakfa

回答

2

試試這個 -

awk '{ if (NR != $1) {print NR; exit 1} }' file.txt 
4 
+0

@EdMorton - 我會添加命令的解釋。 –

+1

@EdMorton - 羅傑那。 –

2

,因爲你有一個解決方案已經,這裏是另一種方法,與以前的值進行比較。

awk '$1!=p+1{print p+1} {p=$1}' file 

如果您有多個缺失值,您的位置比較將不起作用。

+0

完美,只需添加一些可以解釋awk的OP的說明,並且您正在使用某個快捷方式。另外,如果2行之間缺少1個以上的數字,則需要循環;-) – NeronLeVelu

0

也許這將幫助:

seq $(tail -1 file)|diff - file|grep -Po '.*(?=d)' 
4 

自從我學習awk以及

awk 'BEGIN{i=0}{i++;if(i!=$1){print i;i=$1}}' file 
4 

`awk` explanation read each number from `$1` into array `i` and increment that number list line by line with `i++`, if the number is not sequential, then print it. 

cat file 
1 
2 
3 
5 
6 
7 
8 
9 
11 
12 
13 
15 

awk 'BEGIN{i=0}{i++;if(i!=$1){print i;i=$1}}' file 
4 
10 
14