Benutzer Diskussion:Cae

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen

Sowas wie "tac", aber bitte felderweise...

Neulich im Debainforum-Jabber-Chat:

2011-07-24 20:46:58     cae     gibt es so etwas wie tac, allerdings innerhalb der Zeile?
                                Oder darf ich mich mit awk begnügen
2011-07-24 20:47:06     cae     ?

Ein spezielles Programm dafür fällt mir grad nicht ein...
Ich schätze mal sed-Experten schütteln das auf sed-Basis schnell aus'm Ärmel...
In awk fällt mir folgender Beispiel-Einzeiler dazu ein:

awk -F: '{ for( i=NF ; i>0 ; i-- ) printf "%s%s",$(i),i==1?RS:FS }'

Files können dahinein gepiped werden oder namentlich nach dem in '...' eingeschlossenen awk-Code angegeben werden.

Beispiellauf mit Pipe... head -5 ...damit die Testdaten nicht zuviele werden... Ziel ist das feldweise Rückwärtssortieren von /etc/passwd:

(yeti@xs3:4)~/für_cae$ head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
(yeti@xs3:4)~/für_cae$ head -5 /etc/passwd | awk -F: '{ for( i=NF ; i>0 ; i-- ) printf "%s%s",$(i),i==1?RS:FS }'
/bin/bash:/root:root:0:0:x:root
/bin/sh:/usr/sbin:daemon:1:1:x:daemon
/bin/sh:/bin:bin:2:2:x:bin
/bin/sh:/dev:sys:3:3:x:sys
/bin/sync:/bin:sync:65534:4:x:sync

Hier in einer leicht anderen Form als mawk-Skript namens tuc...
(ich teste lieber mit mawk statt gawk, da gawk zuviele Features hat die awks anderer Unixe nicht haben...)

Der Feltdtrenner wird dabei anders übergeben (-v FS=:) und auch einen anderen Record-Seperator (RS) dessen Defaultwert Newline ist, könnte ähnlich angegeben werden...

(yeti@xs3:4)~/für_cae$ ls -l
insgesamt 4
-rwxr-xr-x 1 yeti yeti 80 25. Jul 02:32 tuc
(yeti@xs3:4)~/für_cae$ cat tuc
#!/usr/bin/mawk -f
{
        for( i=NF ; i>0 ; i-- )
                printf "%s%s",$(i),i==1?RS:FS
}
(yeti@xs3:4)~/für_cae$ head -5 /etc/passwd | ./tuc -v FS=:
/bin/bash:/root:root:0:0:x:root
/bin/sh:/usr/sbin:daemon:1:1:x:daemon
/bin/sh:/bin:bin:2:2:x:bin
/bin/sh:/dev:sys:3:3:x:sys
/bin/sync:/bin:sync:65534:4:x:sync

Man könnte natürlich auch etwas in awk schreiben das dann Optionen -f und -r für diese Trennzeichen auswertet statt die awk-spezifische "-v VARNAME=WERT" Variante zu nehmen, aber das würde mehr Code bedeuten als die Sachen die Deine Frage beantworten und so nur von der ursprünglichen Frage ablenken... schöner geht immer...

Yeti 02:47, 25. Jul. 2011 (CEST)