Jak podzielić ciąg, gdy zawiera on symbole potoku |
. Chcę je podzielić, aby były w tablicy.
próbowałem
echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'
Co działa dobrze. Jeśli mój ciąg jest taki, "12|23|11"
jak podzielić je na tablicę?
OFS
, wstaw przecinki między nimi, abyprint
zobaczyć je jako oddzielne argumenty.echo "12:23:11" | sed "s/.*://"
echo "12:23:11" | sed "s/.*://"
) usuń wszystko do (włącznie) ostatniego ":", zachowując tylko "11" ... działa, aby uzyskać ostatnią liczbę, ale musiałby zostać zmodyfikowany (w trudny do odczytania sposób), aby uzyskać 2. numer, itd. awk (i podział awk) jest znacznie bardziej elegancki i czytelny.cut
Odpowiedzi:
Czy próbowałeś:
źródło
split
jest wyrażeniem regularnym i|
jest specjalnym symbolem, który musi zostać zmieniony. Wykorzystaniesplit($0, a, "\|")
|
jest on postrzegany jako znak, a nie specjalny symbol, jest umieszczenie go między[]
: tj.split($0, a, "[|]")
# Podoba mi się to lepiej niż '\ |', w niektórych przypadkach, zwłaszcza gdy jest to jakiś wariant wyrażenia regularnego ( perl vs grep vs .. others?) może mieć "|" zinterpretowane dosłownie i „\ |” postrzegane jako separator wyrażeń regularnych, zamiast odwrotnie ... ymmvAby podzielić ciąg na tablicę
awk
, używamy funkcjisplit()
:Jeśli nie podano separatora, używa znaku
FS
, który domyślnie jest spacją:Możemy podać separator, na przykład
:
:Co jest równoważne ustawieniu go przez
FS
:W gawk możesz także podać separator jako wyrażenie regularne:
A nawet zobacz, jaki separator znajdował się na każdym kroku, używając jego czwartego parametru:
Zacytujmy stronę podręcznika systemowego GNU awk :
źródło
Proszę być bardziej precyzyjnym! Co masz na myśli mówiąc „to nie działa”? Opublikuj dokładne dane wyjściowe (lub komunikat o błędzie), wersję swojego systemu operacyjnego i awk:
Lub używając podziału:
Edycja: w Solarisie musisz użyć POSIX awk ( / usr / xpg4 / bin / awk ), aby poprawnie przetworzyć 4000 pól.
źródło
for(i = 0
czyfor(i = 1
?for (i = 1; i <= n; ++i)
...Nie podoba mi się to
echo "..." | awk ...
rozwiązanie, ponieważ nazywa niepotrzebnefork
iexec
systemowe wywołania.Wolę rozwiązanie Dimitre z odrobiną skrętu
Lub nieco krótsza wersja:
W tym przypadku rekord wyjściowy złożony, co jest prawdziwym warunkiem, więc zostanie wydrukowany.
W tym konkretnym przypadku
stdin
przekierowania można oszczędzić, ustawiając plikawk zmienna wewnętrzna:użyłem ksh dość długo, ale w grzmotnąćmożna to zarządzać przez wewnętrzną manipulację ciągiem. W pierwszym przypadku oryginalny łańcuch jest dzielony przez wewnętrzny terminator. W drugim przypadku zakłada się, że łańcuch zawsze zawiera pary cyfr oddzielone separatorem jednoznakowym.
Wynik we wszystkich przypadkach to
źródło
bash
wyrażeniu ...Faktycznie
awk
ma funkcję o nazwie „Pole tekstowe Separator Zmienna” ogniwo . Oto jak go używać. W rzeczywistości nie jest to tablica, ale używa wewnętrznych zmiennych $. Aby rozdzielić prosty sznurek, jest to łatwiejsze.źródło
powinno działać.
źródło
źródło
Żart? :)
Co powiesz na
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'
Oto mój wynik:
więc myślę, że to jednak działa ...
źródło
Wiem, że to stare pytanie, ale pomyślałem, że może ktoś taki jak moja sztuczka. Zwłaszcza, że to rozwiązanie nie ogranicza się do określonej ilości pozycji.
Wynik będzie:
źródło