track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
itoss schrieb: Gut - eine einfache Einzeilerlösung ohne Schleife gib es wohl nicht.
Doch, gibt es. Allerdings nicht mit awk (das ist dafür viel zu streng mit seiner Syntax !) und auch nur unformatiert - nämlich mit sed : track@track:~$ echo x{1..25} | sed -r 's/(\S+ )(\S+ )\S+ ((\S+ ){6})(\S+ ){5}/\1\3\2/'
x1 x4 x5 x6 x7 x8 x9 x2 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 Da kann man Feldergruppen bilden, und die dann vertauschen, fallenlassen, oder was auch immer. (Wie gesagt: hier ist die recht "liberale" und trickfreudige Syntax von sed ein echter Vorteil !) LG, track
|
itoss
(Themenstarter)
Anmeldungsdatum: 4. April 2014
Beiträge: 419
|
kB schrieb: itoss schrieb: […] im Prinzip suchte ich eine cut Lösung mit mehrfachen Feldtrenner. Cut interpretiert allerdings jedes Leerzeichen als Feld, sind es mehrere Leerzeichen nach einander werden diese von awk als ein Leerzeichen gesehen, und die Felder dementsprechend gezählt, bei cut irgentwie nicht.
cut trennt die Felder bei einem bestimmten Zeichen. Dieses ist per Vorgabe der Tabulator, kann aber mit der Option -d auf jedes andere einzelne Zeichen gesetzt werden. awk trennt die Felder an Stellen, die einem regulären Ausdruck entsprechen. Dieses ist per Vorgabe white space, kann aber mit der Option -F bzw. per Variable FS auf einen beliebigen regulären Ausdruck gesetzt werden. Wenn Du Zeichenfolgen als Trenner verwenden willst, geht das also nicht mit cut, aber natürlich per awk. Eine andere Möglichkeit wäre, vorher jedes Vorkommen von white space zu normalisieren, z.B. auf einen einzelnen Tabulator und dann für das Umsortieren der Felder cut zu verwenden. Dann geht natürlich auch die von Dir so geschätzte Bereichsauswahl. Die Normalisierung von white space gelingt z.B. mit sed: sed -r 's/\s+/\t/' EINGABEDATEI | cut -f1,4,5-9,2-11-
Das habe ich mir fast gedacht. Ein Vorteil hat awk noch : awk kann auch versch. Feldtrenner in einem Zug nutzen ( ... awk -F "[123]" ... ). Es gibt viele Möglichkeiten ( mit tr könnte man z.b. Auch noch Zeichen tauschen und als Feldtrenner für cut nutzen ). FAZIT : für kurze Strings schreibe ich weiter alles mit awk aus, für längere Strings wird dann auf Schleifen oder eine passende String Filterung zurückgegriffen.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8616
Wohnort: Münster
|
itoss schrieb: kB schrieb: itoss schrieb: […] […]
[…] Ein Vorteil hat awk noch: awk kann auch versch. Feldtrenner in einem Zug nutzen ( ... awk -F "[123]" ... ).
Ja. Das ist ein Beispiel für einen regulären Ausdruck.
|