1

Я пытаюсь перенести приведенный ниже текст в одну строку с разделенным каналом, я получаю сообщение об ошибке, если текст начинается с числа%, в чем проблема, любая другая команда есть

Пример содержимого в текстовом файле

PROMOTIONAL - ATL
36% Extra Money : NML 60=65(Rs.47.85 now, rest Rs.17.15 in 48hrs) + A&B @20p/m +  ACCC DD  for 11 day. 100=100 1 days.
2017-11-21
09:00 AM
10:00 PM
ENGLISH
OR
0.0
10

Команда awk, использующая:

awk '{printf NR==1?$0:"|"$0}' text

Ошибка:

PROMOTIONAL - ATLawk: (FILENAME=text FNR=2) fatal: not enough arguments to satisfy format string</br>
    `|36% Extra Money : NML 60=65(Rs.47.85 now, rest Rs.17.15 in 48hrs) + A&B @20p/m +  ACCC DD  for 11 day. 100=100 1 days.'
         ^ ran out for this one

1 ответ1

1

Проблема в том, что первым аргументом для printf должна быть строка формата. В строках формата знаки процента обрабатываются специально. Чтобы избежать проблемы с вводом, содержащим знак % , попробуйте:

$ awk '{printf "%s",(NR==1?"":"|")$0}' text
PROMOTIONAL - ATL|36% Extra Money : NML 60=65(Rs.47.85 now, rest Rs.17.15 in 48hrs) + A&B @20p/m +  ACCC DD  for 11 day. 100=100 1 days.|2017-11-21|09:00 AM|10:00 PM|ENGLISH|OR|0.0|10

Здесь первый аргумент для printf, являющийся строкой формата, это %s . %s инструктирует awk взять второй аргумент и отформатировать его как строку. Второй аргумент может включать % или нет, это не имеет значения.

Или, что эквивалентно, мы можем использовать:

$ awk '{printf "%s%s",(NR==1?"":"|"),$0}' text
PROMOTIONAL - ATL|36% Extra Money : NML 60=65(Rs.47.85 now, rest Rs.17.15 in 48hrs) + A&B @20p/m +  ACCC DD  for 11 day. 100=100 1 days.|2017-11-21|09:00 AM|10:00 PM|ENGLISH|OR|0.0|10

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .