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 unix
Befehle 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 awk
inAbsatzmodus
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 Shellawk
perl
python
(hängt davon ab, ob es installiert ist)
Oder eine beliebige Kombination der oben genannten Tools.
Mögliche Lösung mit bash
und 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
.txt
Dateien angehängt, auch wenn diese bereits vorhanden sind (eine Eindeutigkeitsprüfung kann auf Anfrage hinzugefügt werden) - Nimmt an, dass das
begin
vorangehtpath:..
und kann daher diese Zeile aus der Eingabe ignorieren und ausgeben, wenn der Pfad gefunden wird. Es wäre möglich, eineBUFFER
Variable zu erstellen, aber das habe ich bisher noch nicht getan. - Möglicherweise fehlen einige Prüfungen auf leere OUT_FILE.