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