2010-07-07 29 views
13

Làm cách nào để tham gia hai dòng bằng awk hoặc sed?Tham gia hai dòng liên tiếp bằng awk hoặc sed

for e.g.: 

Tôi có dữ liệu mà trông như thế này:

abcd 
joinabcd 
efgh 
joinefgh 
ijkl 
joinijkl 

Tôi cần một đầu ra như hình dưới đây:

joinabcdabcd 
joinefghefgh 
joinijklijkl 

Trả lời

32
awk '!(NR%2){print$0p}{p=$0}' infile 
+1

Có ai quan tâm giải thích cách biểu hiện awk này hoạt động không? Phần lớn là phần (NR% 2). – mjuarez

+2

NR đại diện cho số hàng ... % là toán tử modulu (tức là% b là phần còn lại khi a được chia cho b) ... (NR% 2) là modulu của NR bằng hai, tức là đúng khi NR là đồng đều và sai khi lẻ ... ! (NR% 2) là đúng khi NR là lẻ, do đó ... ! (NR% 2) {print $ 0p} có nghĩa là chương trình sẽ in đường ghép nối với biến p, chỉ trên các dòng lẻ ... {p = $ 0} có nghĩa là trên mọi dòng, p được đặt là dòng hiện tại (nhưng chỉ sau khi in dòng hiện tại và dòng trước nếu dòng hiện tại là lẻ). – shiri

+0

Với số lượng dòng đầu vào lẻ, phương thức này sẽ không in dòng cuối cùng. –

4
awk 'BEGIN{i=1}{line[i++]=$0}END{j=1; while (j<i) {print line[j+1] line[j]; j+=2}}' yourfile 

Không cần sed.

+0

Tốt câu trả lời .... nhưng tôi cho rằng tôi yêu cầu cho dòng hoàn toàn không chỉ là lĩnh vực đầu tiên. bây giờ nó cần phải được thay đổi như 'dòng [i + +] = $ 0' thay vì' dòng [i + +] = $ 1'. Nhưng rất tốt câu trả lời hơn ks :) – Vijay

1

Ở đây nó được trong sed:

sed 'h;s/.*//;N;G;s/\n//g' < filename 
+2

Chuyển hướng là không cần thiết. –

+0

@ Dennis Williamson: bạn nói đúng, đó là sức mạnh của thói quen. – Beta

0

Một số cải tiến để kịch bản "sed" ở trên đó sẽ mất sau: -2734406,132904 -2734414,838455 -2734413.594009 -2734417.316269 -2734414,779617

and make it :  

1008 -2734406,132904
2846 -2734414,838455
4636 -2734413,594009
6456 -2734417,316269
8276 -2734414,779617

the "sed" is : "sed 'h;s/.*//;G;N;s/\n/ /g'" 
3

Họ nói bắt chước là hình thức chân thành của flattery.
Dưới đây là một giải pháp Perl lấy cảm hứng bởi mã awk Dimitre của:

perl -lne 'print "$_$p" if $. % 2 == 0; $p = $_' infile 

$_ là dòng hiện
$. được dòng số

0

Bạn có thể sử dụng printf với một ternary:

awk '{printf (NR%2==0) ? $0 "\n" : $0}' 
Các vấn đề liên quan