• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

AWK zmiana separatora

Object Storage Arubacloud
0 głosów
952 wizyt
pytanie zadane 2 maja 2016 w Systemy operacyjne, programy przez Nabu Użytkownik (790 p.)

Mam plik tekstowy "osoby" z danymi:

Jan Nowak, Radziwiłłowska 32/34, 20-270 Lublin, 20#lat

Piotr Kowalski, Lubartowska 2b/2, 20-200 Lublin, 40lat

Zuzanna Krasińska, Popiełuszki 222, 20-100 Lublin,60 lat

#Jacek Michalski, Kochanowskiego 3a, 20-120 Lublin,43 lata

Piotr Kowalewski, Mickiewicza 23b, 00-200 Warszawa,23 #lata

Anna Konopna, Warzyńskiej 17/3, 02-100 Warszawa, 34lata

Maciej Piłsudski, Konopnickiej 17b, 17-212 Koszyc,15 lat

#Grzegorz Piątkowski, Nadbystrzycka 36b, 20-618 Lublin, 23 lata

Przy użyciu awk muszę wyświetlić kod pocztowy oraz miasto osób, które mają na imię Jan lub Piotr. Separatorem pól musi być przecinek.

Zrobiłem już plik tekstowy "polecenie", a w nim wpisałem:

BEGIN {  FS = "," } 
$1 ~/(Piotr|Jan)/ {printf("%s\n" ,$3)} 

Następnie w konsoli wpisuję: $ awk -f polecenie osoby i wyświetla się:

20-270 Lublin

20-200 Lublin

00-200 Warszawa

Ktoś ma jakieś pomysły co zmienić, żeby dodać przecinki między kodami a nazwami miast?

 

4 odpowiedzi

+1 głos
odpowiedź 2 maja 2016 przez SyntaxError Pasjonat (17,170 p.)
wybrane 2 maja 2016 przez Nabu
 
Najlepsza

Na upartego możesz pipe-ować do seda.

awk -f polecenie | sed 's/ //' | sed 's/ /, /'

 

Albo do kolejnego awka:

awk -f polecenie | awk '{printf "%s, %s\n", $1, $2}'

 

+2 głosów
odpowiedź 2 maja 2016 przez Benek Szeryf (91,010 p.)

Spróbuj tego:

awk 'BEGIN {FS = ","} $1 ~/(Piotr|Jan)/ {var = $3; split(var,arr," "); printf("%s, %s\n", arr[1], arr[2])}' osoby
0 głosów
odpowiedź 2 maja 2016 przez Nabu Użytkownik (790 p.)
Dzięki za odpowiedzi. Obie działają, chociaż muszę je jeszcze zrozumieć :)

@SyntaxError po "polecenie" wstawiłem jeszcze "osoby"i wtedy działa
komentarz 3 maja 2016 przez Benek Szeryf (91,010 p.)

W przypadku kodu który przedstawiłem, to początek znasz, bo jest to kopia Twojego kodu. Nowością jest funkcja split(napis, tablica, separator), która rozbija napis, a wyznacznikiem podziału jest separator. Elementy rozbitego napisu umieszcza w tablicy, przy czym tablica jest indeksowana od 1. Twój program na wyjściu generował:

20-270 Lublin

20-200 Lublin

00-200 Warszawa

I każda linia była podstawiana do zmiennej var. Separatorem w tym przypadku jest spacja " ". Kod pocztowy trafia do pierwszego elementu tablicy arr[1], a miasto do arr[2].

 

komentarz 3 maja 2016 przez Nabu Użytkownik (790 p.)

Ok, dzięki za pomoc yes

–1 głos
odpowiedź 3 maja 2016 przez jeremus Maniak (59,720 p.)
bardzo prosto  w sekcji    BEGIN   dodaj OFS=",";

OFS- Output Field Separator
komentarz 3 maja 2016 przez Benek Szeryf (91,010 p.)
W tym przypadku to nie działa, bo najpierw ustawia się separator FS jako przecinek, a potem wypisuje kolumnę trzecią. Spacja pomiędzy kodem pocztowym a nazwą miasta jest spacją w pojedynczym stringu.
komentarz 3 maja 2016 przez jeremus Maniak (59,720 p.)
faktycznie nie doczytałem dokładnie pytania

Podobne pytania

0 głosów
1 odpowiedź 183 wizyt
0 głosów
0 odpowiedzi 147 wizyt
pytanie zadane 19 listopada 2018 w Inne języki przez ArturoS159 Początkujący (440 p.)
0 głosów
1 odpowiedź 135 wizyt
pytanie zadane 3 grudnia 2017 w Inne języki przez kkrukowicz Nowicjusz (140 p.)

92,568 zapytań

141,422 odpowiedzi

319,639 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...