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.

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)


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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.