Como agrupar as linhas no 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.

    
por Costel Balta-Coman 26.01.2016 / 16:55

5 respostas

9

com awk :

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 se aplica a todas as linhas, exceto a primeira
  • print x"-"$0 imprime os valores com um traço entre
  • x=$0 set x (para a próxima iteração)
por 26.01.2016 / 17:01
5

Com POSIX sed :

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

ou versão de uma linha:

sed -e '1{h;d' -e\} -e 'H;x;s/\n/-/' <file
    
por 26.01.2016 / 16:57
5
paste -d- - ./infile <infile

^ Isso funcionaria muito bem, exceto que sua entrada está fora de sintonia. Então ...

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

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

    
por 26.01.2016 / 18:19
2

Mais um sed

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

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

sed -n 'N;y/\n/-/;P;y/-/\n/;D' <input
    
por 26.01.2016 / 20:47
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
    
por 26.01.2016 / 18:48