Làm cách nào để xóa một số cột khỏi tệp trường được phân cách bằng tab với awk
?Xóa các cột khỏi tệp có awk hoặc từ dòng lệnh trên linux
c1 c2 c3 ..... c60
Ví dụ: xóa cột giữa 3 và 29.
Làm cách nào để xóa một số cột khỏi tệp trường được phân cách bằng tab với awk
?Xóa các cột khỏi tệp có awk hoặc từ dòng lệnh trên linux
c1 c2 c3 ..... c60
Ví dụ: xóa cột giữa 3 và 29.
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:
Đâ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
.
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á? –
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! –
Aaaah, ok. Tôi đã phạm một sai lầm. Lỗi của tôi. –
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
Đ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' –
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âu trả lời này trên lưu lượng truy cập có thể giúp bạn: http://stackoverflow.com/questions/2626274/awk-print-all-other-columns-but-not-1-2-and-3 – iwg