Dumping von Dateien basierend auf bestimmten Wörtern

Dumping von Dateien basierend auf bestimmten Wörtern

Ich habe eine Datei:

begin  
path: good  
take this way  
easier path
end  

begin  
path: bad  
You shouldn't go there  
end

begin  
path: good  
Very smooth   
end

begin  
path: bad  
you may face problem  
end  

Basierend auf dem Pfad muss ich eine Datei erstellen:

gut.txt

begin  
path: good  
take this way
easier path 
end 

begin  
path: good  
Very smooth   
end

Ist das möglich, indem nur unixBefehle wie verwendet werden grep awk sed sort?

Antwort1

Im einfachsten Fall, vorausgesetzt, das Format der "Pfad"-Datensätze ist genau wie gezeigt, könnten Sie awkinAbsatzmodus

awk '{print > $3".txt"}' RS= ORS='\n\n' file

Antwort2

Es gibt eine Reihe verschiedener Tools, die Sie unter Linux verwenden können:

  • sh|bash|ksh|csh- oder eine andere Shell
  • awk
  • perl
  • python(hängt davon ab, ob es installiert ist)

Oder eine beliebige Kombination der oben genannten Tools.

Mögliche Lösung mit bashund sed, siehe die Hinweise zu Einschränkungen/Annahmen weiter unten:

#!/bin/bash
IN_FILE="$1"   ## Argument: test.txt
OUT_FILE=

# See done for
while read LINE
do
    case $LINE in
        begin)
            OUT_FILE=
            ;;

        path:*)
            OUT_FILE=$(echo "$LINE" | sed 's/^path: \(.*\)/\1/g').txt
            ## TODO: Do a first-seen OUT_FILE check and truncate file.
            echo "begin" >> "$OUT_FILE"   # TODO: Write from buffer instead
            echo "$LINE" >> "$OUT_FILE"
            ;;

        *)
            if [ ! -z "$OUT_FILE" ]
            then
                echo "$LINE" >> "$OUT_FILE"
            else
                ## TODO: Append to a buffer
            fi
           ;;
    esac
done < "$IN_FILE"

NOTIZ: Der obige Code hat die erwartete Ausgabe erzeugt, aber ich habe ihn nicht überprüft, um sicherzustellen, dass die Logik vollständig/fehlerfrei ist.

Darüber hinaus bestehen die folgenden Einschränkungen und Probleme:

  • Wird an .txtDateien angehängt, auch wenn diese bereits vorhanden sind (eine Eindeutigkeitsprüfung kann auf Anfrage hinzugefügt werden)
  • Nimmt an, dass das beginvorangeht path:..und kann daher diese Zeile aus der Eingabe ignorieren und ausgeben, wenn der Pfad gefunden wird. Es wäre möglich, eine BUFFERVariable zu erstellen, aber das habe ich bisher noch nicht getan.
  • Möglicherweise fehlen einige Prüfungen auf leere OUT_FILE.

verwandte Informationen