¿Cómo agrupar líneas en archivo por dos?


9

Tengo un archivo de texto como este:

a
b
c
d
e
f
g

¿Cómo puedo agrupar esas líneas para obtener una salida como esta:

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

Tengo que hacer esto en shell (sh, csh, bash).

He encontrado esto:

cat file | xargs -n2

pero el último elemento del primer grupo no se convierte en el primero del segundo.

Respuestas:


9

Con awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 aplica en todas las líneas, excepto la primera
  • print x"-"$0 imprima los valores con un guión entre
  • x=$0conjunto x(para la próxima iteración)

5

Con POSIX sed:

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

o versión de una línea:

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

Necesito que la primera letra de la segunda línea sea la última en la primera línea ...
Costel Balta-Coman

Buen uso del espacio de espera.
Comodín el

Sí, está bien.
mikeserv

¿Podría explicar cómo funciona esto?
Yossarian

5
paste -d- - ./infile <infile

^ Eso funcionaría realmente bien, excepto que su entrada es off-by-one. Entonces...

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

... funcionaría, pero tal vez sea demasiado complicado ...


Bueno, eso es exactamente lo mismo que se me ocurrió al principio después de leer mal el requisito de OP, pero decidí dejarlo sedsolo.
Cuonglm

@cuonglm: ¿lo leí mal?
mikeserv

1
No, apuesto Pero necesitas sed 1d\;\$dcorregirlo.
Cuonglm

¿Qué tal esta variante? sed '2~2p' infile | paste -d- - -
steeldriver

1
Ahora veo. paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas

2

Uno mas sed

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

y se puede modificar (gracias a mikeserv ):

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

1
y/-\n/\n-/podría reemplazar ambos s /// tal vez. Si lo hiciera, sería más rápido, portátil para el uso \ n y más corto.
mikeserv

1

Una versión pura bash -

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.