awk脚本将值以列为基础放在另一个列值上

时间:2018-04-04 11:34:30

标签: linux bash awk scripting

我正在尝试使用下面的脚本来替换列值。 但是数据量很大,大约有33000行。 因此,当我运行脚本时,我得到错误"参数列表太长" 请让我知道其他方式..

if($33="100000000"){$36="EA"}
if($33="100000001"){$36="EA"}
if($33="100000002"){$36="EA"}
if($33="100000003"){$36="EA"}
if($33="100000004"){$36="EA"}
if($33="100000005"){$36="EA"}
if($33="100000006"){$36="EA"}
if($33="100000007"){$36="EA"}
if($33="100000008"){$36="EA"}
if($33="100000009"){$36="EA"}
if($33="100000010"){$36="EA"}
if($33="100000011"){$36="EA"}
if($33="100000012"){$36="EA"}
if($33="100000013"){$36="EA"}
if($33="100000014"){$36="EA"}
if($33="100000015"){$36="EA"}
if($33="100000016"){$36="EA"}
if($33="100000017"){$36="EA"}
if($33="100000018"){$36="EA"}
if($33="100000019"){$36="EA"}
if($33="100000020"){$36="EA"}

示例输入文件

SourceIifier|SourleName|GntCode|Dision|Suvision|ProfitCe1|Profie2|Plade|Retuiod|SuppliN|DocType|Suppe|Docummber|Docte|Originer|OrigDate|CRDST|LineNumber|CustoN|UINorComposition|OriginaN|Custoame|Custoe|BillTe|Shite|POS|PortCode|ShippingBillNumber|ShippingBillDate|FOB|ExportDuty|HSNorSAC|ProductCode|ProductDescription|Categorduct|UnitOement|Quantity|Taxabue|Integratede|Integratount|Centraate|CentralTt|StaURate|StateUTTaxAmount|CessRateAdvalorem|CessAmountAdvalorem|CessRateSpecific|CessAmountSpecific|Invoalue|ReverseChargeFlag|TCSFlag|eComGSTIN|ITCFlag|ReasonForCreditDebitNote|AccountingVoucmber|Accountinate|Userdefinedfield1|Userdefinedfield2|Userdefinedfield3|Additionalfield1|Additionalfield2|Additlfield3|Additionalfield4|Additionalfield5
    SAP|SAP_OSR_INV|||||||date+%m%Y|08AAACT2T|IN|EXPWT|262881626|02.02.2018||||10||||TVVAHALI|1151040011|8|8|8||||||9984|EVD0|EVDCOCOaterial|||0|8.47|0|0|9|0.76|9|0.76|||||||||||1301312397||ZEVD|1210||||||0
    SAP|SAP_OSR_INV|||||||date+%m%Y|08AAACZT|IV|EXPWT|2627|02.02.2018||||10||||TVVHALI|1151040011|8|8|8||||||9984|EVD0|EVDCOAMaterial|||0|8.47|0|0|9|0.76|9|0.76|||||||||||130139||ZEVD|1210||||||0
    SAP|SAP_OSR_INV|||||||date+%m%Y|08AAAZT|NV|AN|2628|02.02.2018||||20||||TVHVAISHALI|1151040011|8|8|8||||||9984|EVD0|EVDCOCOCDMAMaterial|||0|8.47|0|0|9|0.76|9|0.76|||||||||||13014||ZEVD|1210||||||0

我的代码:

awk -F"|" -v OFS="|" '{
if($33="100000000"){$36="EA"}
if($33="100000001"){$36="EA"}
if($33="100000002"){$36="EA"}
if($33="100000003"){$36="EA"}
if($33="100000004"){$36="EA"}
if($33="100000005"){$36="EA"}
if($33="100000006"){$36="EA"}
if($33="100000007"){$36="EA"}
if($33="100000008"){$36="EA"}
if($33="100000009"){$36="EA"}
if($33="100000010"){$36="EA"}1' inputfile > outputfile

这里的代码只是示例,但实际上有大约33000行。

下面是Sample Awk code ..

  BEGIN {
FS="|";
OFS="|";
}
{
    if($33="100000000"){$36="EA"}
    if($33="100000001"){$36="EA"}
    if($33="100000002"){$36="EA"}
    if($33="100000003"){$36="EA"}
    if($33="100000004"){$36="EA"}
    if($33="100000005"){$36="EA"}1 inputfile > outputfile

并在下面调用它

awk -f script.awk

以下是调用awk脚本的错误。

  awk: fpostp.awk:33445: if($36=="M") {$36="MTR"}} TFinaloutputp7_6_3_d_OYMNC_w.csv > TFinaloutputt_w36.csv
awk: fpostp.awk:33445:                                                       ^ syntax error
awk: fpostp.awk:33445: if($36=="M") {$36="MTR"}} TFinaloutputp7_6_3_d_OYMNC_w.csv > TFinaloutputt_w36.csv
awk: fpostp.awk:33445:                                                                               ^ syntax error

在执行awk -f script.awk时,无法在其他文件中重定向输出

1 个答案:

答案 0 :(得分:0)

编程不是那样的,如果写它可能会变得无聊,那必然会有另一种方式。

awk -F"|" -v OFS="|" '$33>=100 && $33<200{$36="EA";print} $33>=200 && $33<300{$36="FB";print}' inputfile > outputfile

第一个awk是一种模式匹配语言,在花括号外的模式匹配的行上,它执行大括号内的内容。

不需要if语法,因为它是固有的。

模式可以是复合的,awk知道什么数字没有被告知(并且任意数学上的数学)。

我缩短了$33中的值,并构成了$36变成的内容和位置 对$36

范围内的$36每次更改,通常会发出一个声明

如果这不是你的目标,那么这个问题需要进行一些改进。

编辑:

也许你正在根据涉及的任意条件将$36掩盖到一个常量 $33只有你知道并且有很多...在某个地方的文件中。 (我假装您将列表隔离在名为filter.list

的文件中

所以也许像是

awk 'FNR==NR{filter[$1]++}FNR!=NR && $33 in filter {$36="EA"}' filter.list inputfile > outputfile

FNR是文件的编号行,NR是整个脚本编号行 它们与第一个文件相同, 所以在这里使用它来区别对待第一个文件。