Hilfe zur Textformatierung

Hilfe zur Textformatierung

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 awkwelchem ​​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 sedals auch awkdie Variationen in dieser Antwort (sowie die shVariante am Ende unten) würden mit Leerzeichen in den Daten umgehen, entweder in den MGZeichenfolgen oder in den userZeichenfolgen:

$ 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.

verwandte Informationen