2016-05-03 11 views
3

ich den folgenden Befehl leite die groß wie lange arbeitet, wie sie in dem ersten Dateiinhalt ist:AWK FNR == NR auf einer leere Datei

awk -F, 'FNR==NR {a[tolower($1)]++; next} !a[tolower($1)]' OutSideSyncUsers.csv NewUsers.csv 

Wenn die erste Datei leer ist, der Befehl nicht funktionieren . Ich fand eine online-Referenz:

alle Programme, die die Zwei-Dateien Idiom verwenden, nicht korrekt funktionieren, wenn die erste Datei (in diesem Fall leer ist, awk werden die Aktionen zugeordnet NR == FNR ausführen beim Lesen der zweiten Datei). Um das zu korrigieren, können Sie die NR == FNR-Bedingung verstärken, indem Sie einen Test hinzufügen, der überprüft, dass auch FILENAME gleich ARGV [1] ist.

Ich bin nicht sicher, ob ich verstehen, wie (oder wo) in der Abfrage der Testprüfung hinzuzufügen gleich ARGV [1]

Jede Hilfe apperciated würde

Antwort

4

Sie können diese zusätzlichen Bedingungen wie diesen :

awk -F, 'ARGV[1] == FILENAME{a[tolower($1)]++; next} !a[tolower($1)]' OutSideSyncUsers.csv NewUsers.csv 

Zusätzliche Bedingung ARGV[1]==FILENAME stellt sicher, dass der erste Block führt nur in Argumentliste nur die erste Datei. Wenn die erste Datei leer ist, wird der erste Block einfach übersprungen. Auf diese Weise stellen Sie sicher, dass der zweite Block !a[tolower($1)] immer in der zweiten Datei in der Argumentliste ausgeführt wird.

+1

genial, Ihre Erklärung ist genau die Informationen, die ich gesucht habe – moore1emu

+1

Ich habe die Erklärung in meiner Antwort hinzugefügt. 'FILENAME' wird bereits von' awk' auf den aktuellen Eingabedateinamen gesetzt. – anubhava

+1

Das ist auf @EdMorton. Ja, nach dieser Prüfung wird 'FNR == NR' nicht benötigt. – anubhava

4

Mit GNU awk Verwendung ARGIND:

awk -F, '{k=tolower($1)} ARGIND==1{a[k]; next} !(k in a)' OutSideSyncUsers.csv NewUsers.csv 

mit anderen awks eine Annäherung ist:

awk -F, '{k=tolower($1)} FILENAME==ARGV[1]{a[k]; next} !(k in a)' OutSideSyncUsers.csv NewUsers.csv 

aber das schlägt fehl, wenn/wenn Sie die gleiche Datei zweimal parsen.

+1

Ja, guter Fall der Verwendung von 'ARGIND' – anubhava

Verwandte Themen