请求您的帮助。 需要在awk中使用linux执行以下任务。 我有两个文件。 我需要检查文件1中的任何documentN(column1)值是否也存在于column1(billdoc)中的file2中,如果找到,则对应于文件2中的此BillDoc值,如果我们将Curr(column2)值设置为INR以外的值,然后在文件1中需要将供应类型(column2)替换为文件1中的documentN值的EXPWT。
例如,我们在file1和file2中都有值262842964,而对于file2中的值,我们将Curr(column2)值作为USD(即NON INR)。所以我需要用EXPWT替换文件1中的CAN的column2(supplytype)值。
文件1
DocumentN SupplyType
262842964 CAN
E08/1002/00798 TAX
E08/1002/00816 TAX
INDTR1117GSM1459 CAN
INDTR1117GSM5530 TAX
262852823 TAX
文件2
BillDoc Curr
262881626 INR
262881627 INR
262842964 USD
262881629 INR
E08/1002/00816 USD
INDTR1117GSM5530 USD
答案 0 :(得分:1)
awk 'NR==FNR { if(FNR!=1&&$2!="INR") arr[$1]=1; next}
FNR!=1 && $0 && $1 in arr { $2="EXPWT" }
1;' file2 file1
结果是
DocumentN SupplyType
262842964 EXPWT
E08/1002/00798 TAX
E08/1002/00816 EXPWT
INDTR1117GSM1459 CAN
INDTR1117GSM5530 EXPWT
262852823 TAX
我假设您只想更新file1中的第二个记录字段,其中file2中的货币为non-IND
,EXPWT
FNR!=1 && $0 && $1 in arr
中的$ 0,是考虑空行
@kvantour回答你可以使用sub($2,"EXPWT")
来保留原始字段分隔符,但要确保第一个字段不包含第二个字段的字符串
答案 1 :(得分:0)
据我了解你想:
EXPWT
时,才将file1中的第2列替换为INR
。因此,我们的想法是将file2
存储在由a
编制索引的数组$1
中。我们不会存储所有值,只会存储$2 != "INR"
的值。在file2
完全编入索引后,我们只需检查密钥file1
是否在$1
中即可处理a
。如果是,则执行替换。这转换为:
awk '(NR==FNR)&&(FNR>1)&&($2!="INR") {a[$1]=1; next}
(FNR==1){print;next}
($1 in a) { $2="EXPWT" }
1' file2 file1
如果您想保持间距相同,可以将$2="EXPWT"
替换为sub($2,"EXPWT")