Мне нравится использовать awk для вещей, у которых есть записи.tr
tr аннотирует текст, sed
- это s tream ed итор, но awk
понимает концепцию записей, полей, разделителей полей,и т. д.
Итак, чтобы завершить ваш набор параметров, вот решение в минимальном awk:
$ awk -F ' *\\| *' '{$1=$1} 1' OFS='|' input.txt
1|First|PO BOX 123|DAYTON|OH|3432-222
2|Second|PO BOX 2223|CALIFORNIA|CA|23423
3|THIRD|PO BOX 21|COLUMBUS|OH|2223
Это устанавливает разделитель поля ввода с -F
и разделитель поля вывода с OFS
.Сценарий состоит из оператора, который приводит к перезаписи записи с помощью OFS
, и оператора (ярлык 1
) для печати строки.
Обратите внимание на странное экранирование вертикальной черты в -F
вариант.Если вы хотите использовать это, чтобы избежать путаницы, вы можете вместо этого awk -F ' *[|] *' ...
.
Чтобы быть еще короче за счет ясности, вы также можете использовать:
$ awk -F ' *[|] *' '$1=$1' OFS='|' input.txt
Это превращает оператор перезаписи записи в условие, которое всегда должно возвращать true, тем самым устраняя необходимость в ярлыке 1
.Хотя он сбрасывает несколько символов из сценария, я включаю его только для развлечения;гораздо лучше использовать код, который не заставляет вас чесать голову, когда вы перечитываете его через год или два.;)