要检查文件1中column1的值是否存在于file2中,并检查另一列

时间:2018-03-27 07:44:19

标签: linux shell perl awk scripting

请求您的帮助。 需要在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

2 个答案:

答案 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-INDEXPWT

FNR!=1 && $0 && $1 in arr中的

$ 0,是考虑空行

@kvantour回答你可以使用sub($2,"EXPWT")来保留原始字段分隔符,但要确保第一个字段不包含第二个字段的字符串

答案 1 :(得分:0)

据我了解你想:

  • 如果file1中的第1列位于file2的第1列中,则当且仅当file2中的第2列不是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")