Si potrebbe pensare che ORS e OFS di awk sarebbe un modo ragionevole per gestire questa situazione:
$ awk '{print $1,$2}' OFS="-" ORS=", " input.txt
Ma questo si traduce in un ORS finale perché l'ingresso contiene un ritorno a capo sull'ultima riga. Il newline è un separatore di record, quindi dalla prospettiva di awk c'è un ultimo record vuoto nell'input.È possibile aggirare questo problema con un po 'di hacker, ma la complessità risultante elimina l'eleganza del rivestimento unico.
Quindi ecco la mia opinione su questo. Dal momento che dici di "scrivere più valori di colonna", è possibile che il mucking con ORS e OFS possa causare problemi. Quindi possiamo ottenere l'output desiderato interamente con la formattazione.
$ cat input.txt
3 2
5 4
1 8
$ awk '{printf "%s%d-%d",t,$1,$2; t=", "} END{print ""}' input.txt
3-2, 5-4, 1-8
Questo è simile a Michael e gli approcci single-pass di Rook, ma utilizza un unico printf
e correttamente utilizza la stringa di formato per la formattazione.
Probabilmente questo risultato è trascurabilmente migliore della soluzione di Michael perché un incarico dovrebbe richiedere meno CPU rispetto a un test e notevolmente migliore rispetto a qualsiasi soluzione multi-pass in quanto il file deve essere letto solo una volta.
Grazie, è tutto! – Perlnika
FYI, questo uso di 'tr' e' paste' dovrebbe funzionare in qualsiasi ambiente POSIX, non è limitato ai coreutils GNU. – ghoti