Jak zdefiniować ogranicznik „tab” z „cut” w BASH?

215

Oto przykład użycia cutdzielenia danych wejściowych na pola za pomocą separatora spacji i uzyskania drugiego pola:

cut -f2 -d' '

Jak ogranicznik może być zdefiniowany jako tabulator zamiast spacji?

Muhammad Hasan Khan
źródło
4
Tab jest domyślnym ogranicznikiem. cut -f 2
Melah

Odpowiedzi:

301

Dwie drogi:

Naciśnij Ctrl+, Va następnie Tab.

cut -f2 -d'   ' infile

lub napisz to w ten sposób:

cut -f2 -d$'\t' infile
Birei
źródło
10
$ '' - bash'ism, AFAIR
poige
8
Żadne z nich nie działa oczywiście w systemie Windows (np. Git Bash). Użyj tam odpowiedzi @ Mikel (domyślnym ogranicznikiem jest tab, po prostu pomiń -dargument).
Ahmed Fasih
4
@poige, to pochodzi ksh93, nie bash. Jest to obsługiwane przynajmniej przez ksh93, zsh, bash, mksh i FreeBSD sh ( może to doprowadzić do kolejnej poważnej zmiany standardowej specyfikacji POSIXsh ).
Stéphane Chazelas
191

Tab jest ustawieniem domyślnym.

Zobacz stronę man cut .

-d delim
         Use delim as the field delimiter character instead of the tab
         character.

Więc powinieneś po prostu napisać

cut -f 2
Mikel
źródło
2
Ups nie zauważył tej linii.
Muhammad Hasan Khan
4
Ale prawdopodobnie zawsze bezpieczniej jest wyraźnie wymienić takie flagi, zarówno dla czytelności, jak i przenośności. Mogę sobie wyobrazić, że niektórzy ludzie projektujący system cutWindows nie przestrzegaliby pełnego standardu.
Willem Van Onsem,
3
Należy zaakceptować odpowiedź: najprostszy kod, najprostsze wyjaśnienie. ya
uiled
5
Ta odpowiedź zmieniła moje życie
matheeeny
1
@WillemVanOnsem, jeśli ktoś napisze wersję cutdla systemu Windows i nie przestrzega jej specyfikacji POSIX , nie ma powodu zakładać, że jakikolwiek skrypt POSIX będzie działał z tym systemem. Trzymaj się funkcji określonych przez POSIX. Nie próbuj dopuszczać hipotetycznych przyszłych niezgodnych implementacji; nie to oznacza „przenośność”.
Wildcard
12
awk -F '\t' '{ print $2 }' inputfile

Wyodrębnia to drugie rozdzielane tabulatorami pole każdego wiersza wprowadzania inputfile.

Iľja
źródło
10

Bardziej ogólnie, nie wymagając żadnych niewidocznych znaków: Użyj, traby przekonwertować ograniczniki na format, który można łatwiej określić cut.

$ echo -e "a\tb\tc" |tr '\t' ' ' |cut -d' ' -f2
b

tr to proste, ale potężne narzędzie do dopasowywania i zastępowania znaków.

nobar
źródło
1
Ale co, jeśli dane wejściowe są abc(space)def(tab)ghi? Twoja odpowiedź przyniesie def, ale powinna ulec ghi. Podobnie, jeśli dane wejściowe są ABC(tab)DEF(space)GHI, twoja odpowiedź przyniesie DEF, ale powinna ustąpić DEF(space)GHI.
G-Man
@ G-Man: Ogranicznik spacji był tylko przykładem. Użyj dowolnego separatora odpowiedniego dla danych - na przykład przecinka. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
nobar
... Ale tak, jeśli separator musi być tabulatorem, moje podejście nie zadziała.
nobar