awk - 如何替换 csv 文件中字符串中的分号?

Dan*_* 61 3 csv bash awk

我需要管理公司中的 smtp 日志文件处理。

这些日志文件需要导入到 MSSQL,因此我的工作就是提供这些数据。

我收到奇怪的未送达消息,其中带有“;” 在字符串中,我需要用逗号替换它。

所以我得到的是:

Sender;Recipient;Operation;Answer;Error;Servername
bla@bla.com;rockit@sohard.com;RCPT TO;450;+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions;+try+later;M0641
Run Code Online (Sandbox Code Playgroud)

提及“;” 在“限制”后面的答案字段中,不知道为什么邮件服务器发送分号,也许是为了惹恼我:P

经过大量研究后,我尝试使用 awk 进行以下操作:

awk 'BEGIN{FS=OFS=";"} {for (i=5;i<=NF;i++) gsub (";",",",$i)} 1' myfile.csv
Run Code Online (Sandbox Code Playgroud)

这个命令实际上有效,但似乎它对我的文件“;”没有任何作用。在错误字段中仍然存在。我在这里缺少什么?

Joh*_*024 5

将第五个及更高版本替换;,

$ awk -F\; '{for (i=1;i<=NF;i++) printf "%s%s",$i,(i==NF?ORS:(i<=4?";":","))}' myfile.csv 
Sender;Recipient;Operation;Answer;Error,Servername
bla@bla.com;rockit@sohard.com;RCPT TO;450;+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)

怎么运行的:

  • -F\;

    这将输入的字段分隔符设置为;

  • for (i=1;i<=NF;i++) printf "%s%s",$i,(i==NF?ORS:(i<=4?";":","))

    此循环遍历每个字段并打印该字段,如果我们位于最后一个字段,则打印该字段,后跟 (a) ORS,或者 (b),如果我们位于第 5 个或更高字段,或者 (c);如果我们位于前四个字段之一。

全部替换;,

尝试:

$ awk -F\; '{$1=$1} 1' OFS=, myfile.csv
Sender,Recipient,Operation,Answer,Error,Servername
bla@bla.com,rockit@sohard.com,RCPT TO,450,+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)

怎么运行的:

  • -F\;

    这将输入上的字段分隔符设置为分号。

  • $1=$1

    这会导致 awk 认为该行已更改,因此 awk 将更新输出行以使用新的字段分隔符。

  • 1

    这告诉 awk 打印该行。

  • OFS=,

    这将输出上的字段分隔符设置为逗号。

替代方案#1

$ awk '{gsub(/;/, ",")} 1' myfile.csv
Sender,Recipient,Operation,Answer,Error,Servername
bla@bla.com,rockit@sohard.com,RCPT TO,450,+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)

替代方案#2

$ sed 's/;/,/g'  myfile.csv
Sender,Recipient,Operation,Answer,Error,Servername
bla@bla.com,rockit@sohard.com,RCPT TO,450,+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)