sed parsuje dane: pola (słowa) oddzielone spacjami

4

Używam sedw systemie Linux, próbując dopasować linie danych mające trzy pola, tabulator oddzielony (ale separacja może być dowolna biała spacja), jak w:

 12.3 0a 1b
 15.5 0v 1h
 17.7 5k 3c

; teraz używam tego:

sed -n 's/^\([^[:blank:]]*\)[[:blank:]]*\([^[:blank:]]*\)[[:blank:]]*\([^[:blank:]]*\)/\1\t\3\t\2/p' mydata.txt

... więc jestem w stanie wyodrębnić i manipulować (w przykładzie, tylko pozycja inwersja) poprzez poszczególne pola \1, \2, \3.

Czy istnieje lepszy sposób na określenie tego?

Twoje zdrowie!

sdaau
źródło
2
sedmoże nie być najlepszym narzędziem do tego. Czy jest jakiś szczególny powód, dla którego nie chcesz używać awk, perllub coś lepszego?
dmckee
Cześć @dmckee - zazwyczaj nie jestem zbyt dobrze zaznajomiony z, awklub perl, więc zawsze gdy mam taki problem z „odwróceniem pola w danych tekstowych”, pierwszą rzeczą, o której myślę, jest to, co wiem: „ \2 \1” z sed. Jednak sednieadekwatność do zadania jest również odpowiedzią, którą doceniam ( ponieważ, jak powiedziałem, nie jest to pierwsza rzecz, która przychodzi mi na myśl, gdy mam ten problem ) ... Pozdrawiam!
sdaau

Odpowiedzi:

6

Trywialny przykład w awk sugerujący, co można zrobić

awk '{print $2 $1 $3}` < input_file.txt

po prostu przestawia pierwsze dwa pola podczas drukowania wszystkich trzech na wszystkich liniach.

Aby zmienić kolejność tych wierszy, mają dokładnie trzy pola, zachowaj wszystkie, które zaczynają się od #(tj. Komentarz w językach podobnych do sh) i usuń wszystkie inne

awk `/^#/{print $0;next} NF==3{print $2 $1 $3;next} {}' < input_file.txt

Większość systemów uniksowych ma dość kompletną stronę podręcznika awk.

Ważną to do swoich celów jest to, że pola są przystępnie z $1, $2, ..., gdzie „pole” jest zdefiniowany jako ciągi rzeczy oddzielonych FS (czyli separator pól), które domyślnie (przestrzeni).

dmckee
źródło
Wielkie dzięki za to, @dmckee - awkrzeczywiście wydaje się, że lepiej dla tej pracy; Twoje zdrowie!
sdaau