Làm thế nào để nhóm các dòng trong tập tin theo hai?


9

Tôi có một tệp văn bản như thế này:

a
b
c
d
e
f
g

Làm cách nào tôi có thể nhóm các dòng đó để có được đầu ra như thế này:

a-b
b-c
c-d
d-e
e-f
f-g

Tôi phải làm điều này trong shell (sh, csh, bash).

Tôi đã tìm thấy điều này:

cat file | xargs -n2

nhưng yếu tố cuối cùng của nhóm thứ nhất không trở thành thứ nhất của nhóm thứ hai.

Câu trả lời:


9

Với awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 áp dụng trên tất cả các dòng, ngoại trừ dòng đầu tiên
  • print x"-"$0 in các giá trị với dấu gạch ngang giữa
  • x=$0đặt x(cho lần lặp tiếp theo)

5

Với POSIX sed:

sed '1{
  h
  d
}
H
x
s/\n/-/
' <file

hoặc phiên bản một lớp lót:

sed -e '1{h;d' -e\} -e 'H;x;s/\n/-/' <file

Tôi cần chữ cái đầu tiên của dòng thứ hai là dòng cuối cùng trong dòng đầu tiên ...
Costel Balta-Coman

Sử dụng tốt của không gian giữ.
tự đại diện

vâng, nó ổn
mikeerv

Bạn có thể giải thích làm thế nào điều này hoạt động?
Yossian

5
paste -d- - ./infile <infile

^ Điều đó sẽ hoạt động thực sự tốt, ngoại trừ đầu vào của bạn là từng cái một. Vì thế...

{ echo; cat <infile; } | paste -d- - ./infile | sed '1d;$d'

... sẽ hoạt động, nhưng có lẽ quá phức tạp ...


Chà, ban đầu điều đó giống hệt trong đầu tôi sau khi đọc sai yêu cầu của OP, nhưng tôi quyết định để sednó một mình.
cuonglm

@cuonglm - tôi có đọc nhầm không?
mikeerv

1
Không, tôi cá là vậy. Nhưng bạn cần sed 1d\;\$dphải sửa nó.
cuonglm

Làm thế nào về biến thể này? sed '2~2p' infile | paste -d- - -
Steeldo

1
Bây giờ tôi thấy. paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas

2

Một lần nữa sed

sed '$!N;s/\n/-/p;s/-/\n/;D' <input

và có thể được sửa đổi (nhờ mikeerv ):

sed -n 'N;y/\n/-/;P;y/-/\n/;D' <input

1
y/-\n/\n-/có thể thay thế cả s /// có thể. Nếu có, nó sẽ nhanh hơn, có thể mang theo để sử dụng và ngắn hơn.
mikeerv

1

Một phiên bản bash thuần túy -

old=""; while read -r line ; do [[ -n "$old" ]] && echo   $old-$line;   old=$line; done  < input

a-b
b-c
c-d
d-e
e-f
f-g
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.