Незначна зміна відповіді glenn jackman, використовуючи paste
: якщо значення для параметра -d
роздільник містить більше одного символу, paste
переходить по символах по одному, а в поєднанні з -s
параметрами продовжує це робити під час обробки одного вхідного файлу.
Це означає, що ми можемо використовувати все, що хочемо, як роздільник плюс послідовність відходу, \n
щоб об’єднати дві лінії за один раз.
За допомогою коми:
$ paste -s -d ',\n' infile
KEY 4048:1736 string,3
KEY 0:1772 string,1
KEY 4192:1349 string,1
KEY 7329:2407 string,2
KEY 0:1774 string,1
і знак долара:
$ paste -s -d '$\n' infile
KEY 4048:1736 string$3
KEY 0:1772 string$1
KEY 4192:1349 string$1
KEY 7329:2407 string$2
KEY 0:1774 string$1
Що цього зробити не можна - це використовувати роздільник, що складається з декількох символів.
Якщо бонус, якщо paste
сумісний з POSIX, це не змінює новий рядок останнього рядка у файлі, тому для вхідного файлу з непарною кількістю рядків, наприклад
KEY 4048:1736 string
3
KEY 0:1772 string
paste
не буде торкатися символу розділення в останньому рядку:
$ paste -s -d ',\n' infile
KEY 4048:1736 string,3
KEY 0:1772 string
pr
,paste
,awk
,xargs
,sed
іpure bash
! (xargs
повільніше, повільніше, ніж баш !)