【问题标题】:Add tags to CSV file with awk使用 awk 将标签添加到 CSV 文件
【发布时间】:2015-01-11 10:16:06
【问题描述】:

我有一个包含 321 个条目的文件,这是标题:

  • BILLING_NAME
  • CONSUMER_ID
  • BILLING_ADDRESS1
  • BILLING_CITY
  • BILLING_STATE
  • BILLING_ZIP
  • BANK_ROUTING_NUMBER
  • ACH_ACCOUNT_NUMBER

我想在每个条目周围插入 xml 标签:

<billingName>Stackoverflow</billingname> <consumerID>4454</consumerID> etc

一直通过这个文件。上面的这些字段和其他一些未提及的字段将用于发出 curl 请求以通过 API 在文件中添加帐户,因此在我拥有所有必要的标签后,我可以创建顺序 xml 请求。

我已经能够用 awk 分离出上面的所有数据并制作 8 个不同的文件,但我不知道如何将它们连接在一起。

CSV 中的字段分隔符是一个逗号 (,),不幸的是,cut 的工作并不完美,因此我可能需要手动处理一些记录。

我很确定这可以用 awk 完成,但我不完全知道如何循环所有记录。

感谢您的帮助!

编辑

最后一次修改将使所有这些工作完美。

awk -F, '{
filename = $2
$1 = "<api-request>";
$2 = "<verification>";
$3 = "<merchantId>11</merchantId>";
$4 = "<merchantKey>key</merchantKey>";
$5 = "</verification>";
$6 = "<command>add-ach-onfile</command>";
$7 = "<request>";
$8 = "<billingName>"$8"</billingName>";
$9 = "<customerId>"$9"</customerId>";
$10 = "<billingAddress1>"$10"</billingAddress1>";
$11 = "<billingCity>"$11"</billingCity>";
$12 = "<billingState>"$12"</billingState>";
$13 = "<billingZip>"$13"</billingZip>";
$14 = "<bankRoutingNumber>"$14"</bankRoutingNumber>";
$15 = "<achAccountNumber>"$15"</achAccountNumber>";
$16 = "</request>";
$17 = "</api-request>";
print > filename
}' 2export.csv

所以我知道 8-15 美元是自己工作的,但我想添加 1-7 美元、16 美元和 17 美元,以便完成 api 请求。

<api-request> <verification> <merchantId>11</merchantId> <merchantKey>key</merchantKey> </verification> <command>add-ach-onfile</command> <request> <billingName>016114849</billingName> <customerId></customerId> <billingAddress1></billingAddress1> <billingCity></billingCity> <billingState></billingState> <billingZip></billingZip> <bankRoutingNumber></bankRoutingNumber> <achAccountNumber></achAccountNumber> </request> </api-request>

以上显示新标签有效,但现有标签不包含数据。我很确定我只需要更改 $8-15 的内容,让它从我的 2export.csv 文件中读取,而不是从标准输入中读取,但我的所有尝试都不起作用。

【问题讨论】:

  • stackover flow,4544,1000 W Any Street,Salt Lake City,UT,84101,122874015,874 stack exchange,254870,8080 N Broadford Avenue,Santa Cruz,CA,95065,825643792,9044564351298 数据可以是任何你喜欢的。

标签: xml shell unix awk sed


【解决方案1】:

你可以很容易地使用 awk 完成它

$ awk -F, '{
 $1 = "<billing_name>"$1"</billing_name>";
 $2 = "<consumer_id>"$2"</consumer_id>";
 $3 = "<billing_address1>"$3"</billing_address1>";
 $4 = "<billing_city>"$4"</billing_city>";
 $5 = "<billing_state>"$5"</billing_state>";
 $6 = "<billing_zip>"$6"</billing_zip>";
 $7 = "<bank_routing_number>"$7"</bank_routing_number>";
 $8 = "<ach_account_number>"$8"</ach_account_number>";
 }1' test

会产生类似的输出

<billing_name>stackoverflow</billing_name> <consumer_id>4454</consumer_id> etc

编辑

将行拆分到不同的文件

$ awk -F, '{
     filename = $1
     $1 = "<billing_name>"$1"</billing_name>";
     $2 = "<consumer_id>"$2"</consumer_id>";
     $3 = "<billing_address1>"$3"</billing_address1>";
     $4 = "<billing_city>"$4"</billing_city>";
     $5 = "<billing_state>"$5"</billing_state>";
     $6 = "<billing_zip>"$6"</billing_zip>";
     $7 = "<bank_routing_number>"$7"</bank_routing_number>";
     $8 = "<ach_account_number>"$8"</ach_account_number>";

     print > filename
     }' test

【讨论】:

  • 这非常有效!当我拆分文件时,我知道我非常接近。现在有什么想法我是如何将每一行分隔成具有顺序名称的自己的文件的吗?
  • 您可以在 awk 中使用重定向,例如 print "&lt;billing_name&gt;"$1"&lt;/billing_name&gt;" &gt; billing_namefile
  • 您好 nu11p01n73R,抱歉,不是将每个标签重定向到文件,而是将每行/行重定向到自己的文件。所以 stackoverflow 将在它自己的文件中,堆栈交换也是如此。
  • 你好 nu11p01n73R!两者都完全正确!所以唯一的区别是 filename = $1 和 print $0 > filename 非常聪明!非常感谢您在这方面的帮助。
  • print $0中的$0可以跳过,print就够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2022-07-07
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2023-02-05
  • 2012-03-07
相关资源
最近更新 更多