Como agrupar linhas em arquivo por dois?

9

Eu tenho um arquivo de texto como este:

a
b
c
d
e
f
g

Como posso agrupar essas linhas para obter uma saída como esta:

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

Eu tenho que fazer isso no shell (sh, csh, bash).

Eu encontrei isto:

cat file | xargs -n2

mas o último elemento do primeiro grupo não se tornou o primeiro do segundo.

Costel Balta-Coman
fonte

Respostas:

9

Com awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 aplica-se a todas as linhas, exceto a primeira
  • print x"-"$0 imprima os valores com traço entre
  • x=$0set x(para a próxima iteração)
caos
fonte
5

Com o POSIX sed:

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

ou versão one-liner:

sed -e '1{h;d' -e\} -e 'H;x;s/\n/-/' <file
cuonglm
fonte
Eu preciso a primeira letra da segunda linha para ser o último na primeira linha ...
Costel Balta-Coman
Bom uso do espaço de espera.
Curinga
Sim, está tudo bem.
precisa saber é o seguinte
Você poderia explicar como isso funciona?
Yossarian 27/01
5
paste -d- - ./infile <infile

^ Isso funcionaria muito bem, exceto que sua entrada é individual. Assim...

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

... funcionaria, mas talvez seja muito complicado ...

mikeserv
fonte
Bem, isso é exatamente o mesmo que me veio à mente depois de ler mal o requisito de OP, mas decidi deixar sedisso sozinho.
precisa saber é
@cuonglm - eu interpretei errado?
precisa saber é o seguinte
1
Não, aposto. Mas você precisa sed 1d\;\$dcorrigi-lo.
cuonglm
E essa variante? sed '2~2p' infile | paste -d- - -
steeldriver
1
Agora eu vejo. paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas
2

Mais um sed

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

e pode ser modificado (graças a mikeserv ):

sed -n 'N;y/\n/-/;P;y/-/\n/;D' <input
Costas
fonte
1
y/-\n/\n-/poderia substituir ambos s /// talvez. Se o fizesse, seria mais rápido, portátil para o uso e mais curto.
precisa saber é
1

Uma versão pura do 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
fonte