转置某些消息内容时出现 AWK 错误

转置某些消息内容时出现 AWK 错误

我尝试将下面的文本转置为用管道分隔的单行,如果文本以数字%开头,则会出现一些错误,问题是什么,还有其他命令吗

txt 文件中的示例内容

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

问题在于,第一个参数应该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

相关内容