cắt cột 2 từ tệp văn bản


15

Tệp văn bản của tôi không có dấu phân cách để chỉ định dấu phân cách chỉ khoảng trắng, làm cách nào để cắt cột 2 thành tệp đầu ra,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Vì vậy, đầu ra tôi cần là

207
412
432

Câu trả lời:


13

Dễ dàng nhất là awkxử lý nhiều không gian liên tiếp như một lần duy nhất, vì vậy

awk '{print $2}' file

in

207
412
431

Nhưng rõ ràng có rất nhiều, rất nhiều công cụ khác sẽ thực hiện công việc, thậm chí không được thiết kế cho nhiệm vụ như grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

Sử dụng các đường ống để gửi dữ liệu của bạn (ví dụ: cat Cột.txt) thành hình cắt.

cat columns.txt | cut -d" " -f5

Trong dữ liệu mẫu bạn đã cung cấp, một dấu phân cách không gian duy nhất đặt dữ liệu bạn muốn vào trường 5. Để gửi đầu ra đó vào một tệp khác, hãy sử dụng chuyển hướng.

cat collumns.txt | cut -d" " -f5 > field2.txt

Sử dụng lệnh awk, bạn có thể làm một cái gì đó như bên dưới để tự động nhận ra trường bạn đang theo vì có dữ liệu ở đó (?) Tôi cần tìm hiểu thêm về awk.

awk -F' ' '{print $2}' columns.txt

3
Các incatation cat ... |hiếm khi cần thiết. Hầu hết các lệnh Unix như cutlấy một hoặc nhiều tệp đầu vào làm đối số, vd cut -d" " -f5 columns.txt.
Denis Howe

1

như @jimmij đã nói, awk '{print $2}' filelà câu trả lời đơn giản nhất.

Nếu, vì một số lý do, bạn không muốn sử dụng awkvà khăng khăng sử dụng cut, bạn có thể sử dụng sedđể chuyển đổi mọi phiên bản của hai hoặc nhiều khoảng trắng thành một tab ( cutdấu phân cách mặc định) trước khi cắt thành:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

Bạn vẫn có thể sử dụng các khoảng trắng làm dấu phân cách, bạn sẽ có nhiều cột hơn. Tăng giá trị bạn cung cấp cut -d' ' -ftừ 2 lên 5 hoặc có thể 6. Tăng số cho đến khi bạn nhận được kết quả mong muốn.


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Trên đây rất hữu ích khi các tiện ích Linux như awk để trích xuất dữ liệu không hoạt động nếu bạn đang thay đổi thành người dùng "root" bên trong tập lệnh shell như bên dưới:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF

1
Lý do duy nhất " awksẽ không hoạt động" trong ví dụ của bạn là tài liệu ở đây không được trích dẫn, có nghĩa là phần $2này sẽ được mở rộng bởi trình bao đến tham số vị trí thứ hai. Các giải pháp có lẽ không phải để chuyển sang một greplệnh nhưng hoặc là thoát khỏi $trong $2khi \$2hoặc chỉ đơn giản là trích dẫn toàn bộ tài liệu bằng cách sử dụng <<'EOF'ở vị trí của <<EOF. Cũng lưu ý rằng nhiệm vụ trong ví dụ của bạn được thực hiện đơn giản hơn pgrep.
Kusalananda

Cảm ơn rất nhiều @Kusalananda. Nó làm việc như một say mê.
Alok Tiwari
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.