Cái gì tạo thành một 'trường' cho lệnh cắt?


16

Ví dụ, cutlệnh có thể lấy tham số -f, theoman

chỉ chọn những lĩnh vực này; cũng in bất kỳ dòng nào không chứa ký tự dấu phân cách, trừ khi tùy chọn -s được chỉ định

Trong bối cảnh này, một lĩnh vực là gì?

Câu trả lời:


19

Thuật ngữ "trường" thường được liên kết với các công cụ như cutawk. Một trường sẽ tương tự như một cột giá trị dữ liệu, nếu bạn lấy dữ liệu và phân tách nó bằng một ký tự cụ thể. Thông thường nhân vật được sử dụng để làm điều này là a Space.

Tuy nhiên, như trường hợp của hầu hết các công cụ, nó có thể cấu hình được. Ví dụ:

  • awk = awk -F"," ...- sẽ phân tách bằng dấu phẩy (tức là ,).
  • cắt = cut -d"," ...- sẽ phân tách bằng dấu phẩy (tức là ,).

Ví dụ

Điều này đầu tiên cho thấy cách awktự động sẽ phân chia trên không gian.

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Điều này cho thấy làm thế nào cutsẽ phân chia trên không gian quá.

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.

Ở đây chúng tôi có một danh sách CSV của dữ liệu cột mà chúng tôi đang sử dụng cutđể trả về cột 1 & 4.

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4

Awk cũng có thể làm điều này:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4

Awk cũng tinh tế hơn một chút khi đối phó với nhiều loại nhân vật tách biệt. Ở đây nó xử lý Tabscùng với Spacesnơi chúng được trộn lẫn cùng một lúc:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

Điều gì về chuyển đổi -s để cắt?

Đối với công tắc này, chỉ đơn giản là cutkhông in bất kỳ dòng nào không chứa ký tự phân cách được chỉ định qua công -dtắc.

Thí dụ

Nói rằng chúng tôi đã có tập tin này.

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.

LƯU Ý: Có khoảng trắng và tab trong chuỗi thứ 2 ở trên.

Bây giờ khi chúng tôi xử lý các chuỗi này bằng cách sử dụng cutcó và không có công -stắc:

$ cut -d" " -f1-6 sample.txt 
This is a space string.
This is a space  
Thisstringcontainsneither.

$ cut -d" " -f1-6 -s sample.txt 
This is a space string.
This is a space  

Trong ví dụ thứ 2, bạn có thể thấy rằng công -stắc đã bỏ qua bất kỳ chuỗi nào từ đầu ra không chứa dấu phân cách , Space.


8

Trường theo POSIX là bất kỳ phần nào của dòng được phân tách bằng bất kỳ ký tự nào trong IFS" dấu tách trường đầu vào (hoặc dấu tách trường bên trong ). " . Với Bash bạn có thể chạy printf '%q\n' "$IFS"để xem giá trị của nó.


Làm một echo '$IFS' | cat -vet để xem giá trị mặc định trông như thế nào trong shell.
C0deDaedalus

1
IFS được shell sử dụng cho hầu hết các mục đích (không phải tất cả), nhưng không phải bởi các chương trình khác và đặc biệt không phải cutlà câu hỏi được hỏi.
dave_thndry_085

Không giống như awk, cắt cũng chỉ hỗ trợ một dấu phân cách tại một thời điểm, do đó cut -d "$IFS"sẽ xảy ra lỗi, trong khi awk -F"[ \t\n]"hoạt động như mong đợi
JGurtz

2

Nó phụ thuộc vào tiện ích được đề cập, nhưng đối với cut, "trường" bắt đầu ở đầu dòng văn bản và bao gồm mọi thứ cho đến tab đầu tiên. Trường thứ hai chạy từ ký tự sau tab đầu tiên, cho đến tab tiếp theo. Và cứ như vậy cho thứ ba, thứ tư, ... Mọi thứ giữa các tab hoặc giữa dòng bắt đầu và tab, hoặc giữa tab và cuối dòng.

Trừ khi bạn chỉ định một dấu phân cách trường với tùy chọn "-d": cut -d: -f2sẽ giúp bạn có mọi thứ giữa các ký tự dấu hai chấm thứ nhất và thứ hai (':').

Các tiện ích khác có định nghĩa khác nhau, nhưng một ký tự tab là phổ biến. awklà một trở lại tốt nếu cutquá nghiêm ngặt, vì awkphân chia các trường dựa trên một hoặc nhiều ký tự khoảng trắng. Điều đó tự nhiên hơn một chút trong nhiều tình huống, nhưng bạn phải biết một chút cú pháp. Để in trường thứ hai theo awk:

awk '{print $2}'

sortlà người lừa tôi sortTrang người đàn ông hiện tại của tôi nói một cái gì đó như "chuyển từ không trống sang trống" cho một người tách trường. Vì một số lý do, phải mất một vài lần để có được sortcác trường được xác định chính xác. joinrõ ràng sử dụng các trường "được phân định bởi khoảng trắng", đây là những gì mà awkmục đích thực hiện theo mặc định.

Đạo đức của câu chuyện là cẩn thận và thử nghiệm nếu bạn không biết.


2

Thuật ngữ "lĩnh vực" không liên quan đến linux nói chung, nhưng với các chương trình cụ thể. Vì vậy, cutsử dụng một loại lĩnh vực khác hơn sort.

Với cut, bạn tự xác định một trường là gì, bằng cách chỉ định một dấu phân cách trường với tùy chọn -d, phân tách các trường trong mỗi dòng.

Nếu dữ liệu của bạn được phân tách bằng dấu hai chấm trong các dòng, bạn có thể kết hợp -d-fđể có được các trường (hoặc cột) 2, 3 và 6 như thế này:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6

1

Khi bạn sử dụng cutlệnh thì phải mất hai đối số chính

-d: viết tắt của dấu phân cách

-f: viết tắt của trường được cắt từ tệp đầu vào

Ex. cut - d "|"  - f1, 2 input_filename

Ở đây outputsẽ được phân tách bằng dấu phân cách "|" và nó sẽ chỉ cắt 2 trường từ tệp đầu vào

Nếu bạn có những dòng sau trong tập tin của bạn

Alex|120000|Admin|1999

Sau đó, nó sẽ cắt 2 trường đó là

Alex|120000

Ví dụ của bạn bị hỏng hoàn toàn do khoảng trắng không chính xác và ngay cả khi chính xác, điều này không thêm gì vào câu trả lời được đưa ra 4 năm trước.
dave_thndry_085

0

cutlà tuyệt vời cho các trường hợp đơn giản, trong đó dấu phân cách là một ký tự đơn và bạn muốn xuất một tập hợp con của các trường đầu vào, theo cùng một thứ tự (ngay cả khi tôi chỉ định -f3,2,1, nó hoạt động giống như -f1,2,3).

awkmột lớp lót linh hoạt hơn nhiều, ví dụ: khi dấu tách trường đầu vào có thể là bất kỳ khoảng trắng ( awkmặc định) hoặc khi bạn muốn xuất các trường theo thứ tự khác hoặc với một định dạng cụ thể.

Ví dụ wc -l myfile | awk '{print $1}'hoặc ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'rất đơn giản, nhưng sẽ khó thực hiện cut.

Tôi đồng ý với các áp phích trước đó rằng các trường / khóa trong sortrất khó để tìm ra! Các lĩnh vực trong joindường như hoạt động tương tự như trong cut, mặc dù joincác tùy chọn rất dễ bị sai.

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.