2013-05-06 18 views
5

Tôi đang cố gắng sử dụng awk để loại bỏ ba trường đầu tiên trong một tệp văn bản. Loại bỏ ba trường đầu tiên thật dễ dàng. Nhưng phần còn lại của dòng được điều sai lầm bởi awk: delimiters được thay đổi từ tab này sang không gianXóa các cột đầu tiên sau đó để lại dòng còn lại bị ảnh hưởng trong awk

Dưới đây là những gì tôi đã cố gắng:

head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }' 

Ba cột đầu tiên được loại bỏ đúng cách. Vấn đề là đầu ra kết thúc với các tab giữa các cột $ 4 $ 5 $ 6 vv được chuyển đổi thành không gian.

+1

Không có biến có tên là "IFS" trong awk. shell có IFS, awk có FS. –

Trả lời

5

trước tiên như ED đã nhận xét, bạn phải sử dụng FS làm dấu phân tách trường trong awk. tab trở thành space trong đầu ra của bạn, bởi vì bạn không xác định OFS.

awk 'BEGIN{FS=OFS="\t"}{$1=$2=$3="";print}' file 

điều này sẽ xóa 3 trường đầu tiên và để văn bản còn lại "bị ảnh hưởng" (bạn sẽ thấy 3 tab hàng đầu). cũng ở đầu ra, <tab> sẽ được giữ lại.

awk 'BEGIN{FS=OFS="\t"}{print $4,$5,$6}' file 

sẽ xuất với không gian/tab hàng đầu. nhưng nếu bạn có 500 cột, bạn phải thực hiện nó trong vòng lặp hoặc sử dụng hàm sub hoặc xem xét các công cụ khác, chẳng hạn như cắt.

3

Nếu bạn không muốn tách lĩnh vực thay đổi sau đó sử dụng sed để loại bỏ 3 cột đầu tiên thay vì:

sed -r 's/(\S+\s+){3}//' file 

Để lưu những thay đổi về các tập tin bạn có thể sử dụng tùy chọn -i:

sed -ri 's/(\S+\s+){3}//' file 
4

Trên thực tế điều này có thể được thực hiện trong một lệnh cắt rất đơn giản như thế này:

cut -f4- inFile 
+0

Tôi ước nó không được đệm. – Nakilon

0
awk '{for (i=4; i<NF; i++) printf $i " "; print $NF}' 
+0

điều này không thành công nếu cột cuối cùng chứa không gian đôi trong tên –

+0

Điều này không tạo ra kết quả mong đợi nếu có ít hơn bốn trường trên bất kỳ dòng nào. (Nó sẽ in cuối cùng của chúng thay vì loại bỏ tất cả.) Thay vào đó bạn có thể sử dụng: 'awk' {for (i = 4; i <= NF; i ++) printf $ i ""; printf "\ n"} ''Hoặc thêm một số logic bổ sung để ngăn chặn dấu cách. – Wildcard