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ć?
8 answers
cut -d ' ' -f 2
Gdzie 2 jest numerem pola oddzielonego spacjami.
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}'
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.
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.
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.
-
pojedynczy cytat ciągi: zawartość wewnątrz
- 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 .
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
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.
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
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
.
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