Come raggruppare le righe nel file per due?


9

Ho un file di testo come questo:

a
b
c
d
e
f
g

Come posso raggruppare quelle righe per ottenere un output come questo:

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

Devo farlo in shell (sh, csh, bash).

Ho trovato questo:

cat file | xargs -n2

ma l'ultimo elemento del primo gruppo non diventa il primo del secondo.

Risposte:


9

Con awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 si applica su tutte le righe, tranne la prima
  • print x"-"$0 stampa i valori con un trattino tra
  • x=$0set x(per la prossima iterazione)

5

Con POSIX sed:

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

o versione one-liner:

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

Ho bisogno che la prima lettera della seconda riga sia l'ultima nella prima riga ...
Costel Balta-Coman,

Bel uso dello spazio di attesa.
Wildcard il

sì, va bene.
Mikeserv,

Potresti spiegare come funziona?
Yossarian,

5
paste -d- - ./infile <infile

^ Funzionerebbe davvero bene, tranne per il fatto che il tuo input è off-by-one. Così...

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

... funzionerebbe, ma forse è troppo complicato ...


Bene, questo è esattamente lo stesso che mi è venuto in mente dopo aver letto male i requisiti del PO, ma ho deciso di lasciarlo sedda solo.
cuonglm,

@cuonglm - l'ho letto male?
Mikeserv,

1
No, scommetto. Ma devi sed 1d\;\$dcorreggerlo.
cuonglm,

Che ne dici di questa variante? sed '2~2p' infile | paste -d- - -
Steeldriver,

1
Ora vedo. paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas,

2

Ancora uno sed

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

e può essere modificato (grazie a mikeserv ):

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

1
y/-\n/\n-/potrebbe sostituire entrambi s /// forse. Se lo facesse sarebbe più veloce, portatile per l'uso \ e più breve.
Mikeserv,

1

Una versione bash pura -

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.