2017-03-28 2 views
0

awk Neuling hier! Ich bitte um Hilfe, um eine einfache spezifische Aufgabe zu lösen.awk: Suche fehlenden Wert in Datei

Hier ist file.txt

1 
2 
3 
5 
6 
7 
8 
9 

Wie Sie eine einzelne Zahl (die Zahl 4) sehen fehlt. Ich möchte auf der Konsole die Nummer 4 drucken, die fehlt. Meine Idee war, die aktuelle Zeilennummer mit dem Eintrag zu vergleichen, und wenn sie nicht übereinstimmen, würde ich die Zeilennummer drucken und beenden. Ich habe versucht

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

Aber es druckt nur eine Zeilenschaltung.

Ich versuche awk über diese kleine Übung zu lernen. Ich interessiere mich daher hauptsächlich für Lösungen mit awk. Ich begrüße auch eine Erklärung dafür, warum mein Code nicht das tut, was ich erwarten würde.

+1

die Variable am Lernen ist 'NR', das' $ 'Präfix entfernen. – karakfa

+0

nein behalte es, wenn es dich verwirrt, wird es andere geben ... – karakfa

Antwort

2

Versuchen Sie, diese -

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

@EdMorton - Ich werde die Erklärung des Befehls hinzufügen. –

+1

@ EdMorton - Roger Das. –

2

da Sie eine Lösung bereits haben, hier ein anderer Ansatz ist, mit früheren Werten verglichen.

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

Ihr Positionsvergleich funktioniert nicht, wenn Sie mehr als einen fehlenden Wert haben.

+0

perfekt, fügen Sie einfach einige Erläuterungen für OP, die awak leveran ist und Sie eine Abkürzung verwenden. Brauche auch eine Schleife wenn mehr als 1 Nummer zwischen 2 Zeilen fehlt ;-) – NeronLeVelu

0

Vielleicht wird dies helfen:

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

Da ich awk auch

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 
Verwandte Themen