2017-05-30 7 views
0

Ich habe zwei Dateien, eine Eingabedatei FileA und eine Referenzdatei RefFile. RefFile enthält die Zeichenfolgen, die ich in jeder Zeile von FileA finden möchte. Jede in FileA nicht gefundene Zeichenfolge sollte stattdessen "NULL" drucken.Finden Sie bestimmte Zeichenfolgen und Drucken

FileA:

MIN=0000;MSI=1111;FLA=2222;DAG=9999 
MIN=000;FLA=2222 

RefFile:

MIN 
MSI 
FLA 

ERWARTETES ERGEBNIS:

MIN=0000;MSI=1111;FLA=2222 
MIN=000;NULL;FLA=2222 

Bisher ist hier mein Skript:

awk -F";" -v key="MSI" '$1 ~ key {$1=$1; print}' FileA

Btw, ich bin nur neu zu Shell-Skripting. Vielen Dank.

Antwort

1

In awk (komplett neu geschrieben):

$ cat program.awk 
BEGIN { FS=OFS=";" } 
NR==FNR { a[++i]=$1; next } 
{ 
    d=""            # print buffer 
    delete b           # record buffer = 
    for(j=1;j<=NF;j++){ 
     split($j,c,"=") 
     b[c[1]]=$j         # b[key]=field 
    } 
    for(j=1;j<=i;j++)         # for all Refs 
     d=d (d==""?"":OFS) (a[j] in b?b[a[j]]:"NULL") # gather buffer 
    print d 
} 
$ awk -f program.awk RefFile FileA 
MIN=0000;MSI=1111;FLA=2222 
MIN=000;NULL;FLA=2222 
+0

Das ist großartig! Wie wäre es, wenn ich NULL hier ausdrucken würde: ** MIN = 000; NULL; FLA = 2222 **? – enigma

+0

Wenn Sie meinen, dass die NULL in FileA ist, wird es in 'c [1]' 'geteilt 'und wenn es in der RefFile ist, wird es ausgedruckt. Wenn Sie meinen, dass das Skript nur den Text NULL erzeugt (wie in Ihrer erwarteten Ausgabe), müssen Sie wirklich eine Regel für sein Aussehen bereitstellen. –

+0

Ja, aber im Grunde möchte ich herausfinden, was in der RefFile in FileA ist, wenn eine bestimmte Zeichenfolge in RefFile nicht in FileA ist, wird nur "NULL" gedruckt. In diesem Fall fehlt MSI in FileA, so dass die Ausgabe für Zeile 2 lautet: MIN = 000, NULL, FLA = 2222. Entschuldigung für die Verwirrung. – enigma

Verwandte Themen