2011-09-26 31 views

Trả lời

11

Bạn có thể lặp qua tất cả các cột và lọc ra những người bạn không muốn:

awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt 

nơi NF cung cấp cho bạn tổng số lĩnh vực trong một bản ghi.
Đối với mỗi cột đáp ứng điều kiện chúng tôi in cột, theo sau là khoảng cách " ".


EDIT: cập nhật sau khi nhận xét từ johnny:

awk -F 'FS' 'BEGIN{FS="\t"}{for (i=1; i<=NF-1; i++) if(i<3 || i>5) {printf $i FS};{print $NF}}' input.txt 

này được cải thiện trong 2 cách sau:

  • giữ tách gốc
  • không nối thêm một tách ở cuối
+0

Không nên bạn in một tab (\ t) thay vì một dấu cách. Anh ấy muốn xóa các trường, có thể không xóa các tab cùng một lúc (nếu tôi hiểu bạn chính xác). – johnny

+0

@ johnny: bạn nói đúng. Tôi cập nhật mã để nó nên xem xét các dấu phân cách chính xác. – oliver

41

Đây là những gì lệnh cut là dành cho:

cut -f1,2,30- inputfile 

Giá trị mặc định là tab. Bạn có thể thay đổi điều đó bằng công tắc -d.

+0

Tôi đã phải xóa '-' cuối cùng để làm cho nó hoạt động trong Ubuntu. Nếu tôi rời khỏi nó, 'cut' sẽ in tất cả các cột. Bất cứ ai cũng có vấn đề này quá? –

+0

Nó sẽ in cột một, hai và ba mươi đến cột cuối cùng (60 câu hỏi). Nếu nó không phải là một lỗi trong Ubuntu! –

+0

Aaaah, ok. Tôi đã phạm một sai lầm. Lỗi của tôi. –

1
awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1' 

Input

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 

Output

c1 c2 c16 c17 c18 c19 c20 c21 
+0

Điều này không xóa cột. Nó lấp đầy chúng và in lại ... với chỉ định của OP được chỉ định bởi một không gian duy nhất mà chúng không yêu cầu. Việc xóa _apparent_ là trùng hợp và cần 'FS' và' OFS' làm mặc định '\ s +'. Một dấu phân cách khá vô dụng và không tương thích với '\ t' của OP, trừ khi tệp của họ tình cờ không thể có các trường trống, vì nó sẽ nén chúng thành các hàng lởm chởm. Bất kỳ dấu phân cách nào khác, ví dụ: '\ T' của OP, cho đầu ra vẫn có các cột không mong muốn, nhưng bây giờ trống. Và '$ 0 = $ 0' là dư thừa và có thể lãng phí. Phương pháp được tạo tài liệu để xây dựng lại một bản ghi là '$ 1 = $ 1' –

0

Perl 'splice' giải pháp mà không thêm đứng đầu hoặc cuối:

perl -lane 'splice @F,3,27; print join " ",@F' file 

Tạo đầu ra:

01.
c1 c2 c30 c31 
Các vấn đề liên quan