Wie versieht man die ersten drei Zeilen einer Datei mit unterschiedlichen Variablen?

Wie versieht man die ersten drei Zeilen einer Datei mit unterschiedlichen Variablen?

Ich muss also ein Protokoll durchgehen, das mir per E-Mail zugeschickt wurde (in Windows), nach einer Zeile suchen, um die Seriennummer des Modells zu ermitteln. Ich dachte, das ließe sich ganz einfach bewerkstelligen, indem ich ein hässliches Batch-Skript schreibe, um die MSG-Datei so zu konvertieren, dass ich die Datei lesen kann. Beispiel:

cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt

damit bleiben mir drei eindeutige Zahlen. Wie füge ich ALPHA zu Zeile 1, BETA zu Zeile 2 und GAMMA zu Zeile 3 mit einem Leerzeichen oder einem : als Trennzeichen hinzu?


Aktualisieren:Die Datei a21s.txtähnelt

0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416 
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414 
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414 

Antwort1

Es gibt viele Möglichkeiten, das zu tun, was Sie suchen, nur einige Beispiele.

awk und eine maßgeschneiderte Lösung

Eine auf Ihr Beispiel zugeschnittene Lösung besteht awkdarin, 3 Variablen zu verwenden und zu übergeben. Dies ist nicht allgemeingültig, denn wenn Sie 4 Zeilen haben, müssen Sie 4 Variablen übergeben und so weiter ...

Der awkBefehl bietet die einfache Möglichkeit, die Spalten über ihre Nummer zu verwalten ( $1, $2$NFdie letzte).

  • Um das Lesen hier einfacher zu gestalten, verwende ich Ihre alte Zwischendateia21s.txt

    awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" '
      NR==1 {print s1,$7} ;  
      NR==2 {print s2,$7} ;  
      NR==3 {print s3,$7} ; '   a21s.txt
    
    • In der ersten Zeile übergibst du 3 Variablen awkmit der Option -v.
    • In den folgenden Zeilen verwenden Sie die interne VariableNR, zählt die Nummer der Zeile. Sie können also die Variable druckenStufe 1, nur wenn Sie die erste Zeile haben, dies2mit dem zweiten ... und so weiter.
    • In der letzten Zeile danach 'können Sie den Dateinamen angeben, sodass Sie den catProzess nicht aufrufen und an diesen weiterleiten müssen awk.
    • Wenn die Variablen (ALPHA, BETA ...) mit einem Mechanismus generiert werden können (z. B. „Serial01, Serial02“), können Sie sie anstelle der Steuerelemente auf der Zeilennummer und der externen Variablen platzieren.
  • Praxishinweis:unter *nix können SieKommandozügeDurch Weiterleiten ( |) einer Ausgabe an die folgende, ohne dass Zwischendateien erstellt werden müssen.
    In Ihrem Beispiel könnten Sie also direkt Folgendes verwenden:

    cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
    

    Stattdessen cutkönnen Sie in diesem Fall den awkBefehl verwenden cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt.

Eine allgemeinere Lösung: paste+awk

Nehmen wir an, Sie haben Ihre a21s.txtDatei und eine weitere ( b.txt) mit der gleichen Zeilenanzahl und innerhalb der Zeichenfolgen (jeweils ein Wort), die Sie mit einem Präfix versehen möchten (wie im Folgenden).

ALPHA
BETA
GAMMA

Sie können einfach verwenden

paste b.txt a21.txt | awk '{print $1,$8}' >  Air21Serials.txt

Beachten Sie, dass die Spalte Ihrer Seriennummer jetzt die 8. ist, da Sie zuvor per Einfügen eine weitere hinzugefügt haben.


Notiz

Fragen Sie Linux selbst nach weiteren Informationen zu man awkundman paste :-)

Antwort2

echo ALPHA>agreep.txt ; Katze "Vor.msg" | Zeichenfolgen2>>agrep.txt

das ist vielleicht nicht die genaue Linie .. das Konzept ist, dass SieErstemöchte das Wort „Alpha“ in die Datei einfügen.. mit einem >-Symbol wird die Datei erstellt, und mit einem >> wird an die Datei angehängt. Ohne „Newline“ sollte das Wort ALPHA dort eingefügt und dann die erste Nachricht angehängt werden.

Sie müssen möglicherweise ein wenig herumspielen, bis der Code genau funktioniert.

EDIT: Suche ergabKatzeUnddruckenfsind bessere Optionen als Echo, da Echo je nach Betriebssystem unterschiedlich sein kann

zB: Katze ("ALPHA: ") > agrep.txt ; Katze "Vor.msg" | Zeichenfolgen2>>agrep.txt

Und für einen „Einzeiler“-Befehl hätte die erste Pipe ein ; oder && sein sollen.

; zwischen Befehlen wird immer der nächste Befehl ausgeführt && zwischen Befehlen wird der nächste Befehl nur ausgeführt, wenn der vorherige erfolgreich war und || (Doppelpix) wird der nächste Befehl nur ausgeführt, wenn der vorherige fehlgeschlagen ist

Antwort3

Ich bin mir nicht sicher, was strings2das tut oder wie Ihre Eingabe aussieht, daher kann ich nicht 100 % sicher sein, dass dies wie erwartet funktioniert. Aber vielleicht weist es Sie zumindest in die richtige Richtung. catkann Eingaben von stdin akzeptieren. Sie könnten also auch Folgendes tun:

echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt

verwandte Informationen