在AWK脚本输出中的字段周围添加双引号?

我已经写了一个awk脚本,可以将分发者文件转换为可导入Magento的CSV文件。 该文件是分号分隔的。

它不会像import商所要求的那样在每个字段周围加上引号。 它工作得很好,但导致数据导入一些问题,而不包括双引号。 我花了几个小时试图找出如何将其添加到现有的脚本,没有太多的运气。 任何帮助将不胜感激 – 我是相当新的AWK。

当前输出

store;websites;attribute_set;type;category_ids;sku;has_options;name;meta_title;meta_description;image;small_image;thumbnail;url_key;url_path;config_attributes;custom_design;page_layout;options_container;country_of_manufacture;msrp_enabled;msrp_display_actual_price_type;gift_message_available;rsr_pn;manufacturer_pn;price;special_price;cost;weight;msrp;status;visibility;manufacturer;enable_googlecheckout;tax_class_id;is_recurring;description;short_description;meta_keyword;custom_layout_update;news_from_date;news_to_date;special_from_date;special_to_date;custom_design_from;custom_design_to;qty;min_qty;use_config_min_qty;is_qty_decimal;backorders;use_config_backorders;min_sale_qty;use_config_min_sale_qty;max_sale_qty;use_config_max_sale_qty;is_in_stock;low_stock_date;notify_stock_qty;use_config_notify_stock_qty;manage_stock;use_config_manage_stock;stock_status_changed_auto;use_config_qty_increments;qty_increments;use_config_enable_qty_inc;enable_qty_increments;is_decimal_divided;stock_status_changed_automatically;use_config_enable_qty_increments;product_name;store_id;product_type_id;product_status_changed;product_changed_websites;gallery;related;upsell;crosssell;tier_prices;associated;bundle_options;grouped;group_price_price;downloadable_options;super_attribute_pricing;product_tags admin;base;Default;simple;2,35,36;844802016148;0;5.11 HOLSTER SHIRT L WHITE;;;/5/1/511-40011-010-L_1.jpg;/5/1/511-40011-010-L_1.jpg;/5/1/511-40011-010-L_1.jpg;511-40011-010-L;511-40011-010-L.html;;;No layout updates;Block after Info Column;;Use config;Use config;No;511-40011-010-L;40011;74.99;;48.00;5;74.99;Enabled;Catalog, Search;5.11 Tactical;Yes;Taxable Goods;No;5.11 Tactical Short Sleeve Shirt L White Holster Shirt Crew 40011;5.11 Tactical Short Sleeve Shirt L White Holster Shirt Crew 40011;;;;;;;;;0;0;1;0;0;1;1;1;0;1;1;;;1;0;1;0;1;0;1;0;0;0;1;5.11 HOLSTER SHIRT L WHITE;0;simple;;;;;;;;;;;;;; 

期望的输出

 "store";"websites";"attribute_set";"type";"category_ids";"sku";"has_options";"name";"meta_title";"meta_description";"image";"small_image";"thumbnail";"url_key";"url_path";"config_attributes";"custom_design";"page_layout";"options_container";"country_of_manufacture";"msrp_enabled";"msrp_display_actual_price_type";"gift_message_available";"rsr_pn";"manufacturer_pn";"price";"special_price";"cost";"weight";"msrp";"status";"visibility";"manufacturer";"enable_googlecheckout";"tax_class_id";"is_recurring";"description";"short_description";"meta_keyword";"custom_layout_update";"news_from_date";"news_to_date";"special_from_date";"special_to_date";"custom_design_from";"custom_design_to";"qty";"min_qty";"use_config_min_qty";"is_qty_decimal";"backorders";"use_config_backorders";"min_sale_qty";"use_config_min_sale_qty";"max_sale_qty";"use_config_max_sale_qty";"is_in_stock";"low_stock_date";"notify_stock_qty";"use_config_notify_stock_qty";"manage_stock";"use_config_manage_stock";"stock_status_changed_auto";"use_config_qty_increments";"qty_increments";"use_config_enable_qty_inc";"enable_qty_increments";"is_decimal_divided";"stock_status_changed_automatically";"use_config_enable_qty_increments";"product_name";"store_id";"product_type_id";"product_status_changed";"product_changed_websites";"gallery";"related";"upsell";"crosssell";"tier_prices";"associated";"bundle_options";"grouped";"group_price_price";"downloadable_options";"super_attribute_pricing";"product_tags" "admin";"base";"Default";"simple";"2,35,36";"844802016148";"0";"5.11 HOLSTER SHIRT L WHITE";"";"";"/5/1/511-40011-010-L_1.jpg";"/5/1/511-40011-010-L_1.jpg";"/5/1/511-40011-010-L_1.jpg";"511-40011-010-L";"511-40011-010-L.html";"";"";"No layout updates";"Block after Info Column";"";"Use config";"Use config";"No";"511-40011-010-L";"40011";"74.99";"";"48.00";"5";"74.99";"Enabled";"Catalog, Search";"5.11 Tactical";"Yes";"Taxable Goods";"No";"5.11 Tactical Short Sleeve Shirt L White Holster Shirt Crew 40011";"5.11 Tactical Short Sleeve Shirt L White Holster Shirt Crew 40011";"";"";"";"";"";"";"";"";"0";"0";"1";"0";"0";"1";"1";"1";"0";"1";"1";"";"";"1";"0";"1";"0";"1";"0";"1";"0";"0";"0";"1";"5.11 HOLSTER SHIRT L WHITE";"0";"simple";"";"";"";"";"";"";"";"";"";"";"";"";"";" 

脚本 – rsrimport.awk

 #!/bin/awk -f # ---------------------------------------------------------------------------------------- # Copyright (c) 2012 - 2013 John Steensen <john.steensen@live.com> # All rights reserved. No warranty, explicit or implicit, provided. # ---------------------------------------------------------------------------------------- # AWK Processing # Updated 03DEC2012@1552 MST # ---------------------------------------------------------------------------------------- # Warnings/Dependancy Notes # AWK # ---------------------------------------------------------------------------------------- BEGIN { FS=";"; OFS=";"; CATEGORY="47"; IMAGE="imagepathfail"; URLKEY="urlkeyfail"; URLPATH="urlpathfail"; print "store", "websites", "attribute_set", "type", "category_ids", "sku", "has_options", "name", "image", "small_image", "thumbnail", "url_key", "url_path", "page_layout", "options_container", "msrp_enabled", "msrp_display_actual_price_type", "gift_message_available", "rsr_pn", "manufacturer_pn", "price", "cost", "weight", "msrp", "manufacturer", "status", "is_recurring", "visibility", "enable_googlecheckout", "tax_class_id", "description", "short_description", "qty", "min_qty", "use_config_min_qty", "is_qty_decimal", "backorders", "use_config_backorders", "min_sale_qty", "use_config_min_sale_qty", "max_sale_qty", "use_config_max_sale_qty", "is_in_stock", "notify_stock_qty", "use_config_notify_stock_qty", "manage_stock", "use_config_manage_stock", "stock_status_changed_auto", "use_config_qty_increments", "qty_increments", "use_config_enable_qty_inc", "enable_qty_increments", "is_decimal_divided", "stock_status_changed_automatically", "use_config_enable_qty_increments", "product_name", "store_id", "product_type_id"; } { # DEFINE CATEGORY if ($4=="1") CATEGORY="2,3,4"; else if ($4=="2") CATEGORY="2,3,7"; else if ($4=="3") CATEGORY="2,3,8"; else if ($4=="4") CATEGORY="2,3,22,23"; else if ($4=="5") CATEGORY="2,3,5"; else if ($4=="7") CATEGORY="2,3,6"; else if ($4=="8") CATEGORY="2,27,28"; else if ($4=="9") CATEGORY="2,27,29"; else if ($4=="10") CATEGORY="2,9,13"; else if ($4=="11") CATEGORY="2,9,14"; else if ($4=="12") CATEGORY="2,35,38"; else if ($4=="13") CATEGORY="2,9,16"; else if ($4=="14") CATEGORY="2,35,37"; else if ($4=="15") CATEGORY="2,19,21"; else if ($4=="16") CATEGORY="2,9,15"; else if ($4=="17") CATEGORY="2,9,16"; else if ($4=="18") CATEGORY="2,19,20"; else if ($4=="20") CATEGORY="2,27,33"; else if ($4=="21") CATEGORY="2,9,17"; else if ($4=="22") CATEGORY="2,3,22,24"; else if ($4=="23") CATEGORY="2,3,22,25"; else if ($4=="24") CATEGORY="2,9,13"; else if ($4=="25") CATEGORY="2,40,43"; else if ($4=="26") CATEGORY="2,40,44"; else if ($4=="27") CATEGORY="2,3,22,26"; else if ($4=="28") CATEGORY="2,27,31"; else if ($4=="29") CATEGORY="2,27,32"; else if ($4=="30") CATEGORY="2,27,30"; else if ($4=="31") CATEGORY="2,27,34"; else if ($4=="32") CATEGORY="2,9,11"; else if ($4=="33") CATEGORY="2,35,36"; else if ($4=="34") CATEGORY="2,9,10"; else if ($4=="35") CATEGORY="2,9,18"; else if ($4=="36") CATEGORY="2,40,42"; else if ($4=="38") CATEGORY="2,40,41"; else if ($4=="39") CATEGORY="2,40,45"; else if ($4=="40") CATEGORY="2,35,39"; else if ($4=="41") CATEGORY="2,9,12"; else if ($4=="43") CATEGORY="2,9,12"; else if ($4=="01") CATEGORY="2,3,4"; else if ($4=="02") CATEGORY="2,3,7"; else if ($4=="03") CATEGORY="2,3,8"; else if ($4=="04") CATEGORY="2,3,22,23"; else if ($4=="05") CATEGORY="2,3,5"; else if ($4=="07") CATEGORY="2,3,6"; else if ($4=="08") CATEGORY="2,27,28"; else if ($4=="09") CATEGORY="2,27,29"; else CATEGORY="47"; # DEFINE IMAGE WITH PATH. IMAGE="/5/1/"$1"_1.jpg"; # DEFINE URL KEY URLKEY=$1; # DEFINE URL PATH URLPATH=$1".html"; print "admin", "base", "Default", "simple", CATEGORY, $1, "0", $3, IMAGE, IMAGE, IMAGE, URLKEY, URLPATH, "No layout updates", "Block after Info Column", "Use config", "Use config", "No", $1, $12, $6, $7, $8, $6, $11, "Enabled", "No", "Catalog, Search", "Yes", "Taxable Goods", $14, $14, $9, "0", "1", "0", "0", "1", "1", "1", "0", "1", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "0", "0", "1", $3, "0", "simple"; } END {} 

如果你想:

将其添加到现有脚本中。

您可以在每个print参数中插入额外的\"\" ,如下所示:

print "\"admin\"", "\"base\"", ...

编辑:

是的,也许sens是更好的解决方案:

BEGIN { OFS="\";\""; } ... print "\"admin", ...., "simple\"";

 awk '{for (i=1;i<=NF;i++) $i="\""$i"\""}1' FS=";" OFS=";" input 

在这种情况下,我会使用sed表达式而不是AWK。

如果您的数据位于名为data.txt的文件中,则可以将其写入:

 sed "s/;/\";\"/g;s/^/\"/;s/$/\"/" data.txt 

这将打印结果到标准输出,但是如果你想要替换文件的内容,只需使用sed -i这种方式:

 sed -i "s/;/\";\"/g;s/^/\"/;s/$/\"/" data.txt 

这就是全部!

说明: sed表达式包含三个由“;”分隔的sed命令 你可以分开运行:

 sed "s/;/\";\"/g 

它做了一个替换(这是什么意思是第一个“s”),然后是“/”(默认分隔符),“;” 这是我们想要取代的。 然后第二个分隔符“/”,和替换: \";\"它是一个序列:转义引号,分号和转义引号。 所以用这个命令我们会替换分号;";" 。 最后/g表示每个; 将被替换(不仅是第一个smicolon)。

如果输入是a;b;c运行第一个命令后,它将是a";"b";"c

现在,我们需要在开头( ^正则表达式)和最后( $ )中添加引号。 所以这就是这个意思:

 sed "s/^/\"/" // the first quote 

 sed "s/$/\"/" // the last quote 

获取所需的输出:

 "a";"b";"c" 

要在条目中添加引号,可以使用简单的AWK循环:

脚本 – simple_loop.awk

 BEGIN {FS=";"} { for(i=1;i<NF;i++){ printf("\"%s\";", $i); } printf("\"%s\"\n",$NF); } 

例如

 echo "admin;base;5.11 HOLSTER SHIRT L WHITE;;" | awk -f simple_loop.awk 

应该输出

 "admin";"base";"5.11 HOLSTER SHIRT L WHITE";"";"" 

让我重构你的程序:

 /#!/bin/awk -f BEGIN { FS=";"; OFS="\";\""; IMAGE="imagepathfail"; URLKEY="urlkeyfail"; URLPATH="urlpathfail"; # DEFINE CATEGORY CATEGORY["1"] ="2,3,4"; CATEGORY["2"] ="2,3,7"; CATEGORY["3"] ="2,3,8"; CATEGORY["4"] ="2,3,22,23"; CATEGORY["5"] ="2,3,5"; CATEGORY["7"] ="2,3,6"; CATEGORY["8"] ="2,27,28"; CATEGORY["9"] ="2,27,29"; CATEGORY["10"]="2,9,13"; CATEGORY["11"]="2,9,14"; CATEGORY["12"]="2,35,38"; CATEGORY["13"]="2,9,16"; CATEGORY["14"]="2,35,37"; CATEGORY["15"]="2,19,21"; CATEGORY["16"]="2,9,15"; CATEGORY["17"]="2,9,16"; CATEGORY["18"]="2,19,20"; CATEGORY["20"]="2,27,33"; CATEGORY["21"]="2,9,17"; CATEGORY["22"]="2,3,22,24"; CATEGORY["23"]="2,3,22,25"; CATEGORY["24"]="2,9,13"; CATEGORY["25"]="2,40,43"; CATEGORY["26"]="2,40,44"; CATEGORY["27"]="2,3,22,26"; CATEGORY["28"]="2,27,31"; CATEGORY["29"]="2,27,32"; CATEGORY["30"]="2,27,30"; CATEGORY["31"]="2,27,34"; CATEGORY["32"]="2,9,11"; CATEGORY["33"]="2,35,36"; CATEGORY["34"]="2,9,10"; CATEGORY["35"]="2,9,18"; CATEGORY["36"]="2,40,42"; CATEGORY["38"]="2,40,41"; CATEGORY["39"]="2,40,45"; CATEGORY["40"]="2,35,39"; CATEGORY["41"]="2,9,12"; CATEGORY["43"]="2,9,12"; CATEGORY["01"]="2,3,4"; CATEGORY["02"]="2,3,7"; CATEGORY["03"]="2,3,8"; CATEGORY["04"]="2,3,22,23"; CATEGORY["05"]="2,3,5"; CATEGORY["07"]="2,3,6"; CATEGORY["08"]="2,27,28"; CATEGORY["09"]="2,27,29"; # header print "store", "websites", "attribute_set", "type", "category_ids", "sku", "has_options", "name", "image", "small_image", "thumbnail", "url_key", "url_path", "page_layout", "options_container", "msrp_enabled", "msrp_display_actual_price_type", "gift_message_available", "rsr_pn", "manufacturer_pn", "price", "cost", "weight", "msrp", "manufacturer", "status", "is_recurring", "visibility", "enable_googlecheckout", "tax_class_id", "description", "short_description", "qty", "min_qty", "use_config_min_qty", "is_qty_decimal", "backorders", "use_config_backorders", "min_sale_qty", "use_config_min_sale_qty", "max_sale_qty", "use_config_max_sale_qty", "is_in_stock", "notify_stock_qty", "use_config_notify_stock_qty", "manage_stock", "use_config_manage_stock", "stock_status_changed_auto", "use_config_qty_increments", "qty_increments", "use_config_enable_qty_inc", "enable_qty_increments", "is_decimal_divided", "stock_status_changed_automatically", "use_config_enable_qty_increments", "product_name", "store_id", "product_type_id"; } function getCategory(val) { return (val in CATEGORY) ? CATEGORY[val] : "47"; } { # DEFINE IMAGE WITH PATH. IMAGE="/5/1/"$1"_1.jpg"; # DEFINE URL KEY URLKEY=$1; # DEFINE URL PATH URLPATH=$1".html"; print "\" "admin", "base", "Default", "simple", getCategory($4), $1, "0", $3, IMAGE, IMAGE, IMAGE, URLKEY, URLPATH, "No layout updates", "Block after Info Column", "Use config", "Use config", "No", $1, $12, $6, $7, $8, $6, $11, "Enabled", "No", "Catalog, Search", "Yes", "Taxable Goods", $14, $14, $9, "0", "1", "0", "0", "1", "1", "1", "0", "1", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "0", "0", "1", $3, "0", "simple" "\""; }