Câu trả lời:
Thuật ngữ "trường" thường được liên kết với các công cụ như cutvà awk. 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 -F"," ...- sẽ phân tách bằng dấu phẩy (tức là ,).cut -d"," ...- sẽ phân tách bằng dấu phẩy (tức là ,).Đ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 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.
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.
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ó.
cutlà câu hỏi được hỏi.
cut -d "$IFS"sẽ xảy ra lỗi, trong khi awk -F"[ \t\n]"hoạt động như mong đợi
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.
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 -dvà -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
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
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.
echo '$IFS' | cat -vetđể xem giá trị mặc định trông như thế nào trongshell.