Ich brauche Hilfe beim Bash-Skripting. Unten ist mein Beitrag:
Grp: MG1
user1
user2
user3
Grp: MG2
user7
user1
user9
user6
user2
Das Ergebnis sollte wie folgt aussehen:
Reporting MG1
MG1,user1
MG1,user2
MG1,user3
Reporting MG2
MG2,user7
MG2,user1
MG2,user9
MG2,user6
MG2,user2
Ich habe es versucht sed -n '/cn:/,/cn:/p' file
, aber es hat nicht das gewünschte Ergebnis gebracht.
Antwort1
mit awk
welchem Werkzeug Sie Ihren Text formatieren können:
awk '/^Grp:/ { OFS=" "; $1= "Reporting"; mg=$2; print; next}
{ OFS=","; print mg, $0}' infile
Antwort2
Verwendung von sed
:
$ cat script.sed
/^Grp: / { ;# A "Grp: " line
s/// ;# Remove "Grp: "
h ;# Save in hold space
s/^/Reporting /p ;# Insert "Reporting " at start, print
d ;# Delete, start next cycle
}
# Any other line:
G ;# Append the hold space
s/\(.*\)\n\(.*\)/\2,\1/ ;# Swap strings around \n, insert comma
$ sed -f script.sed file
Reporting MG1
MG1,user1
MG1,user2
MG1,user3
Reporting MG2
MG2,user7
MG2,user1
MG2,user9
MG2,user6
MG2,user2
Als „Einzeiler“:
sed -e '/^Grp: /{s///;h;s/^/Reporting /p;d;}' \
-e 'G;s/\(.*\)\n\(.*\)/\2,\1/' file
Ein ähnlicher Ansatz wie oben mit awk
:
awk '/^Grp: / { sub("^Grp: ", ""); group = $0; print "Reporting " $0; next }
{ print group "," $0 }' file
Sowohl die sed
als auch awk
die Variationen in dieser Antwort (sowie die sh
Variante am Ende unten) würden mit Leerzeichen in den Daten umgehen, entweder in den MG
Zeichenfolgen oder in den user
Zeichenfolgen:
$ cat file
Grp: some group ID
line 1
the other line
$ sed -e '/^Grp: /{s///;h;s/^/Reporting /p;d;}' -e 'G;s/\(.*\)\n\(.*\)/\2,\1/' file
Reporting some group ID
some group ID,line 1
some group ID,the other line
Nur als lustige Übung. Verwenden Sie /bin/sh
:
while IFS= read -r line; do
case $line in
'Grp: '*)
group=${line#Grp: }
printf 'Reporting %s\n' "$group"
;;
*)
printf '%s,%s\n' "$group" "$line"
esac
done
Ausführen mit
sh script.sh <file
Antwort3
Anhand der obigen Beispieleingaben können Sie Folgendes verwenden:
#!/bin/bash
group=""
while read line; do
if [[ "${line}" =~ ^Grp:* ]]; then
group="$(echo "${line}" | awk '{ print $2 }')"
echo "Reporting ${group}"
elif [[ "${line}" == "" ]]; then
echo
else
echo "${group},${line}"
fi
done
Zum Beispiel:
$ cat input
Grp: MG1
user1
user2
user3
Grp: MG2
user7
user1
user9
user6
user2
$
$ ./ex.sh < input
Reporting MG1
MG1,user1
MG1,user2
MG1,user3
Reporting MG2
MG2,user7
MG2,user1
MG2,user9
MG2,user6
MG2,user2
$
Das Skript führt eine Schleife aus, die eine Textzeile liest. Wenn die Zeile mit beginnt Grp:
, speichert es das zweite durch Leerzeichen getrennte Token als group
. Wenn die Zeile leer ist, wird eine leere Zeile gedruckt. Andernfalls wird die zuletzt gelesene Gruppe gedruckt, gefolgt von einem Komma und dem Inhalt der Zeile.