2013-02-28 30 views

Trả lời

23

thử điều này:

awk '/two/{i++}i==2' file 

với dữ liệu của bạn:

kent$ echo "onefish 
onechicken 
twofish 
twochicken 
twocows 
threechicken"|awk '/two/{i++}i==2' 
twochicken 

lưu ý: nếu file của bạn là rất lớn, làm điều này:

awk '/two/{i++}i==2{print; exit}' file 
+0

tùy chọn thứ hai là cấp trên bất kể tệp được kích hoạt, phải không? – poncha

+0

@poncha, số dòng – Kent

+0

ý của bạn là gì theo 'số dòng'? tôi có nghĩa là thêm '{print; exit} 'sẽ là ý tưởng tốt cho bất kỳ kích thước đầu vào nào ... oh. đó là lựa chọn # 3 thực sự;) tôi đếm sai))) – poncha

17
grep -m2 "two" in-file.txt | tail -n1 

Dừng sau trận đấu thứ hai, sau đó in dòng thứ hai.

+1

không thực hiện chính xác những gì được mong đợi. nếu có nhiều trận đấu hơn hai, nó sẽ xuất nhiều dòng ... – poncha

+0

Đuôi phải là: 'tail -n1'. – Thor

+0

@poncha: thực sự? Grep -m2 đảm bảo chỉ có hai kết quả phù hợp. Tôi đã thay đổi nó, mặc dù tôi nghĩ rằng nó đã được OK trước. –

0

Nếu từ (ở đây word == hai) lặp lại nhiều lần trong một dòng, & bạn muốn prin t dòng đó, sử dụng bên dưới:

word=two 
n=2 
line=`grep -m$n $word -o -n MyFile | sed -n $n's/:.*//p'` 
awk 'FNR=='$line'{print; exit}' MyFile 

ví dụ: Đối dưới đầu vào:

onefish 
onechicken 
twotwofish 
twochicken 
twocows 
threechicken 

nó sẽ in twotwofish, thay vì twochicken.

Đây có thể không phải là những gì user1787038 muốn, nhưng được thêm vào để trả lời nhận xét của riêng tôi.

+0

'-m $ n' trong dòng grep chỉ dành cho một số tối ưu hóa, không cần thiết cho chức năng. – anishsane

1

Cần lưu ý rằng nếu threechickentwocows dòng được hoán đổi, hay còn gọi là:

onefish 
onechicken 
twofish 
twochicken 
threechicken 
twocows 

sau đó phản ứng đầu tiên của Kent (awk '/two/{i++}i==2' file) sẽ mang lại kết quả:

twochicken 
threechicken 

vì phải mất một sự xuất hiện của trận đấu để tăng bộ đếm. Phản hồi cuối cùng của anh ta: awk '/two/{i++}i==2{print; exit}' file tránh sự cố này.