Suchen Sie in Datei a und extrahieren Sie Datei b und ihre gesamten Klammern

Suchen Sie in Datei a und extrahieren Sie Datei b und ihre gesamten Klammern

Ich habe zwei Dateien, die ich verwenden möchteDatei Aund Suchnummer inDatei Bund drucke die gesamten Klammern einschließlich der gesuchten Zeile aus. Ich bin nicht sicher, ob es das ist, was es heißt.

Datei A:

300
302
303

Datei b:

    [300] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [301] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [302] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [303] = {
        name = "John",
        age = "12",
        address = {
        "Person street address"
        },
        job = "Marketing",
        job a = "some job",
        job b = {
        "His job description"
        },
        car = 0,
        salary = 0
    },

Erwartete Ausgabe:

    [300] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [302] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [303] = {
        name = "John",
        age = "12",
        address = {
        "Person street address"
        },
        job = "Marketing",
        job a = "some job",
        job b = {
        "His job description"
        },
        car = 0,
        salary = 0
    },

Habe versucht, awk zu verwenden, aber es funktioniert nicht.

awk 'NR==FNR{a[$1]=1;next} $1 in a && /\[$1\]/,/^\t\},/ {print}' a b > c

Ich danke Ihnen für Ihre Hilfe..

Antwort1

Vorausgesetzt, Sie haben keinen Zugriff auf einen Parser für dieses spezielle Format und Ihre Datensätze sind wirklich so einfach und regelmäßig, wie Sie zeigen, funktioniert dies mit jedem awk in jeder Shell auf jeder UNIX-Box:

$ cat tst.awk
NR == FNR {
    vals["["$1"]"]
    next
}
rec == "" { key = $1 }
{ rec = rec $0 ORS }
/^[[:blank:]]*},$/ {
    if ( key in vals ) {
        printf "%s", rec
    }
    key = rec = ""
}

.

$ awk -f tst.awk file_a file_b
    [300] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [302] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },

Antwort2

Mit dem Befehl Below getestet und funktionierte einwandfrei

Befehl

for i in `cat filea`; do sed -n '/'$i'/,/^[[:space:]]\{4\}\},$/p' fileb; done

Ausgabe

 [300] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [302] = {
        name = "John",
        age = "12",
        address = {""},
        job = "Marketing",
        job a = "some job",
        job b = {"some job"},
        car = 0,
        salary = 0
    },
    [303] = {
        name = "John",
        age = "12",
        address = {
        "Person street address"
        },
        job = "Marketing",
        job a = "some job",
        job b = {
        "His job description"
        },
        car = 0,
        salary = 0
    },

Antwort3

Wenn Sie dies tun, sedkönnte Ihnen die folgende Zeile weiterhelfen.

while read n; do sed -n -e "/^\[$n\]/,/^},$/p" b.txt; done < a.txt

verwandte Informationen