Ich habe die folgende Eingabe :

A|Bash|cat
B|bit|dog
C|Bash|apple
D|Bash|email

Ich möchte die folgende Ausgabe :

cat|Bash|A
apple|Bash|C
email|Bash|D

Die Idee ist, alle Zeilen anzuzeigen, die "Bash" enthalten, und ihre Felder in umgekehrter Reihenfolge anzuzeigen.

Ich kann diese Zeilen in der Vorwärtsreihenfolge mit awk anzeigen:

$ awk '/Bash/' filename.txt

Aber ich kann es nicht in umgekehrter Reihenfolge anzeigen lassen. Gibt es eine Möglichkeit, dies mit awk zu tun?

0
Avnish Bansal 20 Jän. 2019 im 16:31

3 Antworten

Beste Antwort
awk -F\| '/Bash/{print $3"|"$2"|"$1}' file 
cat|Bash|A
apple|Bash|C
email|Bash|D
0
Claes Wikner 21 Jän. 2019 im 23:45

Verwenden von GNU awk:

$ awk '
BEGIN { 
    FS=OFS="|"                            # set the delimiters
    k="Bash"                              # set the keyword
}
$2==k {                                   # if keyword in 2nd field
    a[$1]=$3                              # hash $3 and index with 1st field
}
END {
    PROCINFO["sorted_in"]="@ind_str_asc"  # control the for traverse order
    for(i in a)                           # loop
        print a[i],k,i                    # ... and output
}' file
cat|Bash|A
apple|Bash|C
email|Bash|D
0
James Brown 20 Jän. 2019 im 13:50

Versuchen:

awk -F \| '/Bash/{for(i=NF;i>1;i--){printf("%s|",$i);}print $1}' filename.txt

Wo:

    -F \| - sets the delimiter
    /Bash/ - searching the text you want. (to be more precise you should do $2==/Bash/)
    for - loop from NF which is number of fields. here NF=3. to one above 1.
    printf = to print token i, and add the delimiter
    print - outside the loop, printing the first token. this is outside the loop to avoid having the delimiter "|" as the last character printed.
0
Doron Veeder 20 Jän. 2019 im 18:53