2017-03-28 32 views
0

awk初心者ここに!私は簡単な具体的な課題を解決するための助けを求めています。あなたは、単一の数(数4)が欠落している見ることができるようにここでawk:ファイルの欠損値を検索

file.txt

1 
2 
3 
5 
6 
7 
8 
9 

です。私は、コンソールに番号4がないことを表示したいと思います。私の考えは、エントリと現在の行番号を比較することでした。一致しない場合は、行番号を出力して終了します。試しました

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

しかし、それは改行のみを出力します。

私はこの小さなエクササイズでawkを学びたいと思っています。したがって、私は主にawkを使用するソリューションに興味があります。なぜ私のコードが私が期待していることをしないのかについての説明を歓迎します。

+1

を学んでおりますので

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

を、' $ 'プレフィックスを削除します。 – karakfa

+0

それがあなたを混乱させるなら、他のものがあるでしょう... – karakfa

答えて

2

これを試してみてください -

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

@エドモートン - 私はコマンドの説明を追加します。 –

+1

@EdMorton - Roger That。 –

2

あなたは既に解決策を持っているので、ここでは前の値と比較して、別のアプローチです。

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

複数の欠損値がある場合、位置の比較は機能しません。

+0

完璧な、ちょうどあなたがawanを学習しているいくつかのショートカットを使用しているOPのためのいくつかの説明を追加することができます。また2つの行の間に1つ以上の数がない場合はループを必要とします;-) – NeronLeVelu

0

多分これが役立ちます。私は、変数は `NR`ある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