Mam taki plik cities
:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Chcę wyciąć nazwy miast, aby mieć:
San Diego
St Louis
Orlando
To najlepsze, co mogłem wymyślić:
cut -d ',' -f1 cities | cut -d ']' -f2
Ale to wciąż pozostawia mi miejsce przed imionami. Czy cut
mogę użyć polecenia podobnego, które akceptuje ograniczniki kilku znaków, dzięki czemu mogę kontynuować ]
?
command-line
cut
Kit Sunde
źródło
źródło
tr
jest przydatny do usuwania znaków, których nie chcesz.(inactive)
status, czy nie? Podaj przykładowe dane wyjściowe.cut
do wycinania rzeczy i widać intencję nieudanego przykładu, który mam, powinien być dość jasny w kontekście. Podam próbkę, aby wyjaśnić ją dalej. :)Odpowiedzi:
Awk (sprawdź także informacje o Awk ) jest piękne z tego rodzaju pytaniami. Próbować:
Definiuje to separator pól
-F
jako[],] *
- co oznacza jedno wystąpienie zamykającego nawiasu kwadratowego lub przecinka, po którym następuje zero lub dowolna liczba spacji. Oczywiście możesz to zmienić, aby spełnić wszelkie wymagania. Przeczytaj o wyrażeniach regularnych.Po podzieleniu linii możesz zrobić co chcesz z wynikiem podziału. Tutaj postanowiłem wydrukować drugie pole tylko za pomocą
print $2
. Zauważ, że ważne jest stosowanie pojedynczych cudzysłowów wokół instrukcji awk, w przeciwnym razie 2 $ zostanie zastąpione przez powłokę.źródło
]
nie jest wspornikiem kątowym. Kątowniki są<>
.[]
są „nawiasami kwadratowymi” lub po prostu „nawiasami kwadratowymi”.Możesz zmodyfikować ostatni
cut
w swoim potoku do tego:Powyższe oznacza, że separatorem pól jest spacja i chcemy wybrać wszystkie pola, zaczynając od drugiego. Pełna sekwencja staje się:
źródło
W celu bardziej złożonej analizy należy użyć sed (1) :
Lub używając,
-r
aby uprościć wyrażenie regularne, jak sugeruje pepoluan :źródło
Zwykle używam Perla, gdy robi się za ciężko, by sed i grep.
Istnieje wiele sposobów na napisanie go w Perlu. Na przykład wolisz, aby był szybki lub wolałby obsługiwać niewielkie nieoczekiwane problemy na wejściu (np. Dwie spacje, w których jedna była spodziewana).
Jeden oczywisty sposób (przy założeniu, że identyfikator jest liczbowy, miasto to alfabet, status to alfabet):
Lub wolniej, ale bardziej liberalnie (robi więcej cofania):
Lub szybciej (pole zatrzymuje się przy pierwszym wystąpieniu klamry zamykającej):
Z wiersza poleceń zamiast skryptu można użyć
-n
opcji, która w zasadzie dodajewhile (<>) { BLOCK }
pętlę:lub jeśli chcesz, aby użycie przypominało cięcie, możesz użyć
-F
opcji podobnej do-F
opcji awk , na przykład:W ten sposób oczywiście zakłada się, że żadne pole nie będzie zawierało żadnego ogranicznika.
źródło