Làm cách nào để xác định dấu phân cách 'tab' bằng 'cắt' trong BASH?


215

Dưới đây là một ví dụ về việc sử dụng cutđể ngắt đầu vào thành các trường bằng cách sử dụng dấu phân cách không gian và lấy trường thứ hai:

cut -f2 -d' '

Làm thế nào có thể định nghĩa dấu phân cách là một tab, thay vì một khoảng trắng?



4
Tab là một dấu phân cách mặc định. cắt -f 2
Melah

Câu trả lời:


301

Hai lối:

Nhấn Ctrl+ Vvà sau đó Tab.

cut -f2 -d'   ' infile

hoặc viết nó như thế này:

cut -f2 -d$'\t' infile

10
$ '' - bash'ism, AFAIR
poige

8
Không hoạt động trong Windows (ví dụ, Git Bash) rõ ràng. Sử dụng câu trả lời của @ Mikel ở đó (dấu phân cách mặc định là tab, chỉ cần bỏ qua -dđối số).
Ahmed Fasih


4
@poige, điều đó đến từ ksh93, không phải bash. Điều đó được hỗ trợ bởi ksh93, zsh, bash, mksh và FreeBSD sh ( nó có thể làm cho nó trở thành sự đảo ngược lớn tiếp theo của đặc tả tiêu chuẩn POSIX chosh ).
Stéphane Chazelas


191

Tab là mặc định.

Xem trang cắt người .

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

Vì vậy, bạn chỉ nên viết

cut -f 2

2
Rất tiếc đã không nhận thấy dòng đó.
Muhammad Hasan Khan

4
Nhưng có lẽ luôn an toàn hơn khi đề cập đến những lá cờ như vậy một cách rõ ràng, cho cả khả năng đọc và tính di động. Tôi có thể tưởng tượng một số người thiết kế cutcho Windows sẽ không tuân theo tiêu chuẩn hoàn chỉnh.
Willem Van Onsem

3
Điều này nên được chấp nhận câu trả lời: mã đơn giản nhất, giải thích đơn giản nhất. ya đóng đinh nó: youtube.com/watch?v=dpNTHl7y45Y
nơ ron thần kinh

5
Câu trả lời này đã thay đổi cuộc đời tôi
matheeeny

1
@WillemVanOnsem, nếu ai đó viết phiên bản cutcho Windows và không tuân theo đặc tả POSIX cho nó, không có lý do gì để cho rằng bất kỳ tập lệnh POSIX nào sẽ hoạt động với hệ thống đó. Bám sát các tính năng do POSIX chỉ định. Đừng cố gắng cho phép các triển khai không tuân thủ trong tương lai giả định; đó không phải là "tính di động" nghĩa là gì.
tự đại diện

12
awk -F '\t' '{ print $2 }' inputfile

Điều này trích xuất trường được phân định bằng tab thứ hai của từng dòng đầu vào từ inputfile.


10

Tổng quát hơn, không yêu cầu bất kỳ ký tự vô hình nào: Sử dụng trđể chuyển đổi các dấu phân cách thành định dạng có thể được chỉ định dễ dàng hơn cut.

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

tr là một công cụ phù hợp và thay thế nhân vật đơn giản, nhưng mạnh mẽ.


1
Nhưng nếu đầu vào là abc(space)def(tab)ghigì? Câu trả lời của bạn sẽ mang lại def, nhưng nó sẽ mang lại ghi. Tương tự, nếu đầu vào là ABC(tab)DEF(space)GHI, câu trả lời của bạn sẽ mang lại DEF, nhưng nó sẽ mang lại DEF(space)GHI.
G-Man

@ G-Man: Dấu phân cách không gian chỉ là một ví dụ. Sử dụng bất kỳ dấu phân cách nào phù hợp với dữ liệu của bạn - ví dụ dấu phẩy. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
tộc

... Nhưng, vâng, nếu dấu phân cách phải là một tab, thì cách tiếp cận của tôi sẽ không hiệu quả.
tộc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.