2012-02-16 33 views
6

Ai đó có thể đề nghị phải làm gì nếu tôi phải đọc giữa hai từ khóa nhưđọc ranh giới giữa hai từ khóa

*System_Power 
1 
1.2 
1.8 
2 
*System_Terminate 

Trong trường hợp này asnwer sẽ

1 
1.2 
1.8 
2 

tôi đã cố gắng sử dụng awk như

awk '$0 =="*System_Power"    # start printing when 1st field is *System_Power 
$0 != "*System_Terminate"{    # until reach the *System_Terminate 
print; } ' powerSummary > reportedFailure.k # Read from file powerSummary and pipe to reportedFailure.k 
exit 

nơi dữ liệu trên được tìm thấy ở đâu đó ở giữa tệp nguồnSummary.

Tôi rất biết ơn các chỉnh sửa của bạn.

Trả lời

5

này sẽ làm việc cho bạn:

$ awk '/\*System_Power/{f=1;next}/\*System_Terminate/{f=0}f' infile 
1 
1.2 
1.8 
2 
+0

nó làm việc cho tôi, nhưng tôi không thể tìm thấy một cách nói chung của awk-ing. Mỗi khi tôi nhận được một định dạng mới của giải pháp đó là khá khó để tiêu hóa. Đang cố gắng để có được nó. –

2

Bạn có thể sử dụng sed để trivially chọn văn bản giữa hai dòng phù hợp, nhưng điều này cũng sẽ bao gồm các dòng phù hợp với bản thân ... vì vậy chúng tôi dứt khoát xóa những:

sed -n '/System_Power/,/System_Terminate/ { 
    /^\*/ d 
    p 
}' < input 

AWK cũng có thể chọn văn bản giữa các dòng phù hợp:

awk '/System_Power/,/System_Terminate/ {print}' < input 

... nhưng giống như sed điều này sẽ bao gồm các thuật ngữ bắt đầu/kết thúc. Bạn có thể sửa lỗi này với awk, nhưng tôi nghĩ bạn sẽ có giải pháp sạch hơn với sed.

+0

Có lý do gì khiến bạn sử dụng chuyển hướng thay vì tham số sed/awk không? Đối với tôi những người có thể được viết 'sed ... input' hoặc' awk ... input' mà không có '<'. – jfg956

+0

Không, không có lý do. Chỉ trong tâm trạng của một filterin. – larsks

1

Dưới đây là một số khác:

awk '$1=="*System_Power",$1=="*System_Terminate" {if (!/System*/) print}' in.txt 
1

Điều này có thể làm việc cho bạn:

sed '/^\*System_Power/,/^\*System_Terminate/!d;//d' file 

hay này:

awk '/^\*System_Terminate/{p=0};p;/^\*System_Power/{p=1}' file 
Các vấn đề liên quan