Khi bạn nhận xét trong câu hỏi của bạn, awk
thực sự là con đường để đi. Để sử dụng cut
là có thể cùng với tr -s
để thu hẹp không gian, như câu trả lời của kev cho thấy.
Tuy nhiên, hãy để tôi đi qua tất cả các kết hợp có thể cho độc giả tương lai. Giải thích tại phần Kiểm tra.
tr | cắt
tr -s ' ' < file | cut -d' ' -f4
ôi
awk '{print $4}' file
bash
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
quyến rũ
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Xét nghiệm
Cho tập tin này, hãy kiểm tra các lệnh:
$ cat a
this is line 1 more text
this is line 2 more text
this is line 3 more text
this is line 4 more text
tr | cắt
$ cut -d' ' -f4 a
is
# it does not show what we want!
$ tr -s ' ' < a | cut -d' ' -f4
1
2 # this makes it!
3
4
$
ôi
$ awk '{print $4}' a
1
2
3
4
bash
Điều này đọc các lĩnh vực tuần tự. Bằng cách sử dụng, _
chúng tôi chỉ ra rằng đây là biến số bỏ đi dưới dạng "biến rác" để bỏ qua các trường này. Bằng cách này, chúng tôi lưu trữ $myfield
dưới dạng trường thứ 4 trong tệp, bất kể khoảng trắng ở giữa chúng.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
quyến rũ
Điều này bắt ba nhóm không gian và không có không gian với ([^ ]*[ ]*){3}
. Sau đó, nó bắt bất cứ thứ gì đến cho đến khi một không gian là trường thứ 4, cuối cùng nó được in \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4