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


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

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

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.