
Wie kann ich Zeilen mithilfe der Befehlszeile ändern?
Ich habe beispielsweise diese Zeilen:
Acct-Status-Type = Start
User-Name = "37XXXXXXX"
Event-Timestamp = "Apr 12 2013 15:56:55 AMT"
Ich muss die Reihenfolge wie folgt ändern:
Event-Timestamp = "Apr 12 2013 15:56:55 AMT"
User-Name = "37XXXXXXX"
Acct-Status-Type = Start
Ich muss dies mit einem Befehl tun, sed, awk, Perl oder so etwas.
Antwort1
Hängt davon ab, wo, wie oft, warum usw. Sie dies tun, aber es würde nicht schaden, es in ein Skript zu packen.
Sie können so etwas tun, um in einer bestimmten Reihenfolge zu drucken. Mit diesem Ansatz können Sie auch festlegen, dass nur einige wenige gedruckt werden. Zum Beispiel nur 1 und 3:
Einzeiler:
awk -v order=312 \
'/^/{ln[NR]=$0}END{split(order,a,"");
for(i in a)printf("%s\n",ln[a[i]]);}' \
sample.txt
Oder einfacher zu lesen:
/^/{
ln[NR] = $0
}
END{
split(order,a,"");
for(i in a)
printf("%s\n",ln[a[i]]);
}
Für die Aufteilung können Sie bei mehr als 9 Zeilen ein Trennzeichen hinzufügen.
Z.B:
split(order,a,"-");
# and call by:
awk -v order=3-13-21-12-2 ...
Oder zur Unterstützung mehrerer:
if (order ~ /-/) split(order, a, "-"); # order has "-", split
else if (order ~ /\./) split(order, a, "."); # order has ".", split
else if (order ~/:/) split(order, a, ":"); # order has ":", split
else split(order, a, ""); # none presume numbers split all
Sie können auch Zeilen wie in den folgenden auswählen:
BEGIN {
i = 0;
}
/^\s*Acct-Status-Type/ {ln[++i] = $0 }
/^\s*User-Name/ {ln[++i] = $0 }
/^\s*Event-Timestamp/ {ln[++i] = $0 }
END {
if (order ~ /-/) split(order, a, "-");
else if (order ~ /\./) split(order, a, ".");
else if (order ~/:/) split(order, a, ":");
else split(order, a, "")
for (i in a)
printf("%s\n", ln[a[i]]);
}
Bearbeiten:
Für das letzte Beispiel wäre das wahrscheinlich besser. (Auch aktualisiert dieTeilt):
/^\s*Acct-Status-Type/ {ln[1] = $0 }
/^\s*User-Name/ {ln[2] = $0 }
/^\s*Event-Timestamp/ {ln[3] = $0 }
END {
if (split(order, a, "-|:|,| |\\.") == 1) # Space require quoting of arg.
split(order, a, "")
for (i in a)
printf("%s\n", ln[a[i]]);
}
Antwort2
Mit Python und dem Namen der Datei als Kommandozeilenparameter für das Programm:
import sys
with open(sys.argv[1]) as fp:
for line in fp.readlines()[::-1]:
sys.stdout.write(line)
oder es in diese Datei zurückschreiben:
import sys
with open(sys.argv[1]) as fp:
lines = fp.readlines()
with open(sys.argv[1], 'w') as fp:
for line in lines[::-1]:
fp.write(line)
oder als Filter von stdin nach stdout:
lines = sys.stdin.readlines()
for line in lines[::-1]:
sys.stdout.write(line)