użyj spacji jako ogranicznika za pomocą polecenia cut

Chcę użyć spacji jako ogranicznika za pomocą polecenia cut.

Jakiej składni mogę użyć?

 256
Author: fedorqui, 2009-05-03

8 answers

cut -d ' ' -f 2

Gdzie 2 jest numerem pola oddzielonego spacjami.

 287
Author: RichieHindle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-03 11:28:19

Zazwyczaj jeśli używasz spacji jako ogranicznika, chcesz traktować wiele spacji jako jedną, ponieważ analizujesz wyjście polecenia wyrównującego niektóre kolumny ze spacjami. (a wyszukiwanie w google prowadzi mnie tutaj)

W tym przypadku pojedyncze polecenie cut nie jest wystarczające i musisz użyć:

tr -s ' ' | cut -d ' ' -f 2

Lub

awk '{print $2}'
 123
Author: BeniBela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-28 16:59:24

Można też powiedzieć

cut -d\  -f 2

Zauważ, że po odwrotnym ukośniku są dwie spacje.

 32
Author: Chas. Owens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-03 20:47:35

aby uzupełnić istniejące, pomocne odpowiedzi; końcówka kapelusza do QZ Support za zachęcenie mnie do zamieszczenia osobnej odpowiedzi:

W grę wchodzą dwa różne mechanizmy:

  • (a) czy cut sam wymaga ogranicznika (spacji, w tym przypadku) przekazanego do opcji -d, aby był oddzielnym argumentem lub czy jest dopuszczalne dołączenie go bezpośrednio do -d.

  • (b) jak powłoka ogólnie przetwarza argumenty przed przekazaniem ich do wywoływanego polecenia.

W tym samym roku, w 2008 roku, w ramach projektu POSIX 2009, w ramach projektu POSIX 2009, w 2009 roku, w ramach projektu POSIX 2009, w 2009 roku, w ramach projektu POSIX 2009, w 2009 roku, w ramach projektu POSIX 2009.]}

Jeśli streszczenie standardowego narzędzia pokazuje opcję z obowiązkowe opcja-argument [...] aplikacja zgodna używa oddzielnych argumentów dla tej opcji i jej argumentu opcji. jednakże , zgodne wykonanie: ponadto zezwala aplikacjom na określenie opcji i opcji-argumentu w tym samym łańcuchu argumentów bez znaków interwencyjnych .

Innymi słowy: w tym przypadku, ponieważ -d's option-argument jest obowiązkowe, możesz wybrać czy określić ogranicznik jako :

  • (S) albo: a separate argument
  • (d) lub: jako wartość bezpośrednio dołączone do -d.

Po wybraniu (s) Lub (d), liczy się powłoka's string-dosłowne parsowanie - (b) -:

  • Z podejściem (s) wszystkie poniższe formy są równoważne:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • Z podejściem (d) , wszystkie następujące formy są Odpowiednik:

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

Równoważność jest wyjaśniona przez shell 's string-dosłowne przetwarzanie:

Wszystkie powyższe rozwiązania dają dokładnie ten sam ciąg (w każdej grupie) do czasu cut widzi je :

  • (s): cut widzi -d, jako swójwłasny argument, po którym następuje oddzielny argument zawierający znak spacji-bez cudzysłowów lub przedrostka \!.

  • (d): cut widzi -d plus znak spacji-bez cudzysłowów lub przedrostka \! - jako częśćtego samego argumentu.

Powód, dla którego formy w odpowiednich grupach są ostatecznie identyczne, jest dwojaki, oparty na Jak powłoka parsuje literały łańcuchowe:

  • powłoka pozwala na podanie dosłownego Jak to jest poprzez mechanizm zwany cytowanie, które mogą przybierać kilka form :
    • pojedynczy cytat ciągi: zawartość wewnątrz '...'jest brana dosłownie i tworzy pojedynczy argument
    • Double-quoted strings: zawartość wewnątrz "..."tworzy również pojedynczy argument , ale podlega interpolacji (rozszerza odwołania do zmiennych, takie jak $var, podstawienia poleceń ($(...) lub `...`), lub rozszerzenia arytmetyczne ($(( ... ))).
    • \-cytowanie pojedynczych znaków : a \ poprzedzających pojedynczy znak powoduje, że znak ten jest interpretowany jako literalny.
  • cytowanie uzupełnia usunięcie cytatu, co oznacza, że po przetworzeniu przez powłokę wiersza poleceńusuwa znaki cudzysłowu z argumentów (zawierające '...' lub "..." lub \ instancje) - tak więc wywoływane polecenie nigdy nie widzi znaków cudzysłowu .
 32
Author: mklement0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

I właśnie odkryłem , że możesz również użyć "-d ":

cut "-d "

Test

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
 3
Author: fedorqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45

Scut , Narzędzie podobne do cięcia (mądrzejsze, ale wolniejsze, które stworzyłem), które może używać dowolnego wyrażenia regularnego Perla jako tokena łamającego. Łamanie białych znaków jest domyślne, ale można również łamać wielokrotne wyrażenia regularne, alternatywne wyrażenia regularne itp.

scut -f='6 2 8 7' < input.file  > output.file

Tak więc powyższe polecenie rozbiłoby kolumny na białe znaki i wyodrębniłoby (oparte na 0) KOLs 6 2 8 7 w tej kolejności.

 3
Author: Harry Mangalam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-25 13:55:33

Nie możesz zrobić tego łatwo z cut, jeśli dane mają na przykład wiele spacji. Uznałem, że przydatne jest normalizacja danych wejściowych dla łatwiejszego przetwarzania. Jedną z sztuczek jest użycie sed do normalizacji, jak poniżej.

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar
 2
Author: Anssi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-13 19:13:42

Mam odpowiedź (przyznaję nieco mylącą odpowiedź), która obejmuje sed, wyrażenia regularne i grupy przechwytywania:

  • \S* - Pierwsze słowo
  • \s* - ogranicznik
  • (\S*) - drugie słowo-uchwycone
  • .* - reszta linii

Jako wyrażenie sed grupa przechwytywania musi być zabezpieczona przed ucieczką, tj. \( i \).

\1 zwraca kopię przechwyconej grupy, tzn. drugie słowo.

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

Kiedy patrzysz na ta odpowiedź, jej nieco mylące, i, można pomyśleć, po co zawracać sobie głowę? Cóż, mam nadzieję, że niektóre, może iść " Aha!"i użyje tego wzorca do rozwiązania złożonych problemów z ekstrakcją tekstu za pomocą pojedynczego wyrażenia sed.

 0
Author: Stephen Quan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 06:11:06