¿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.

Costel Balta-Coman
fuente

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)
caos
fuente
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
Cuonglm
fuente
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 ...

mikeserv
fuente
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
Costas
fuente
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
jai_s
fuente