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ư cut
và 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 awk
tự độ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 cut
sẽ 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à cut
khô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 -d
tắ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 cut
có và không có công -s
tắ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 -s
tắ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ó.
cut
là 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: -f2
sẽ 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. awk
là một trở lại tốt nếu cut
quá nghiêm ngặt, vì awk
phâ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}'
sort
là người lừa tôi sort
Trang 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 sort
các trường được xác định chính xác. join
rõ 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à awk
mụ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, cut
sử 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
và -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 cut
lệ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 output
sẽ đượ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
cut
là 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
).
awk
mộ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 ( awk
mặ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 sort
rất khó để tìm ra! Các lĩnh vực trong join
dường như hoạt động tương tự như trong cut
, mặc dù join
cá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
.