2013-06-13 26 views
5

Tôi có câu hỏi nhanh về lệnh AWK. Tôi cần lệnh in cho đến khi kết thúc của dòng trên cùng một dòng, nhưng sau đó khi nó được đến dòng tiếp theo tôi cần nó để in trên một dòng khác. Ví dụ sau sẽ cung cấp sự rõ ràng hơn.Lệnh AWK để in cho đến khi kết thúc dòng

Nói rằng tôi có một tập tin:

0 1 2 3 This is line one 
0 1 2 3 This is line two 
0 1 2 3 This is line three 
0 1 2 3 This is line four 

Tôi đã thử những điều sau đây và nhận được kết quả như sau

awk '{for(i=5;i<=NF;i++) print $i}' fileName >> resultsExample1 

tôi nhận được sau trong resultsExample1

This 
is 
line 
one 
This 
is 
line 
two 
And so on.... 

Ví dụ 2:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample2 

cho resultsExample2 tôi nhận được:

This is line one This is line two this is line three This is line four 

Tôi cũng đã cố gắng:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample3 

Nhưng kết quả là giống như trước một

Cuối cùng tôi muốn những điều sau:

This is line one 
This is line two 
This is line three 
This is line four 

Tôi rất biết ơn sự giúp đỡ của bạn! Cảm ơn trước :)

+2

Trong ví dụ, tất cả các dòng có cùng số cột - luôn luôn là trường hợp của thông tin bạn nhập? –

Trả lời

6

Nó có thể là hơn thẳng về phía trước để sử dụng cut:

$ cut -d' ' -f5- file 
This is line one 
This is line two 
This is line three 
This is line four 

này nói: trên các lĩnh vực không gian tách ra, in từ 5 đến cuối dòng.

Nếu bạn tình cờ có nhiều khoảng trống ở giữa các trường, ban đầu bạn có thể muốn ép chúng bằng tr -s' '.

+6

Điều này sẽ chỉ hoạt động nếu chỉ có chính xác một khoảng trống giữa các trường. – Scrutinizer

+3

Đó là sự thật, @Scrutinizer, nhưng trong trường hợp có nhiều hơn một, chúng tôi đầu tiên có thể ống '| tr -s '' 'để xóa nhiều dấu cách. – fedorqui

+0

Bạn sẽ xử lý điều này như thế nào nếu số lượng dấu cách (dấu phân cách) thay đổi từ một bản ghi đến bản ghi kế tiếp? Ví dụ, áp dụng điều này cho đầu ra của 'ls -l'? – gone

7

OR với awk

awk '{$1=$2=$3=$4=""; sub(/^ */,"", $0); print }' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

Ngoài ra, bạn giải pháp gần như ở đó, bạn chỉ cần buộc một '\ n' được in ở phần cuối của mỗi dòng xử lý, tức là

awk '{for(i=5;i<=NF;i++) {printf $i " "} ; printf "\n"}' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

Lưu ý rằng BEGIN { " " } của bạn không phải là số không. Và bạn nên sử dụng $i thay vì $1 để in giá trị lặp lại hiện tại.

IHTH.

Chỉnh sửa; Lưu ý phản đối sudo_O, tôi đã thêm% s vào dữ liệu. Đây là đầu ra

This is line one 
This is line two 
This is line three 
T%shis is line four 

Đây có thể là vấn đề đối với bạn, vì vậy trường hợp đó được đọc về cách chuyển chuỗi định dạng thành printf.

+2

Bạn không nên sử dụng 'printf' mà không chỉ định định dạng. Bạn nghĩ điều gì sẽ xảy ra nếu một trường có chứa '% s' chẳng hạn? –

+0

Tôi đồng ý với sudo_O. Bạn sẽ nhận được 'awk: không đủ args trong printf (T% shis) 'ví dụ .. – Scrutinizer

+1

Tôi đã tạo nên đầu ra của mình. Chúc mọi người may mắn. – shellter

5

Tôi biết câu hỏi này là rất cũ, nhưng một ví dụ khác awk:

awk '{print substr($0,index($0,$5))}' fileName 

Những gì nó: tìm ra chỉ số mà bạn muốn để bắt đầu in (chỉ số $ 5 $ 0) và in các chuỗi con của $ 0 bắt đầu từ chỉ số đó.

+1

Nó có thể là muộn cho bữa tiệc, nhưng nó làm việc tuyệt vời cho tôi. +1 =) – Terrance

0

awk '{gsub (/[[:digit:]]/,"");{$1=$1}}1' file