代码之家  ›  专栏  ›  技术社区  ›  as7951

Awk检查文件1中column1的值是否存在于文件2中,并在另一列中更新字段

  •  1
  • as7951  · 技术社区  · 7 年前

    请求您的帮助。 需要使用awk在linux中执行以下任务。 我有两个文件。 我需要检查文件1中的任何documentN(column1)值是否也存在于文件2的column1(Billdoc)中,如果找到,则与文件2中的该Billdoc值相对应,如果我们的Curr(column2)值不是INR,则在文件1中需要将supply type(column2)替换为EXPWT,与文件1中的documentN值相对应。

    例如,我们在文件1和文件2中都有262842964的值,相对于文件2中的值,我们将货币(第2列)值作为美元(非印度卢比)。因此,我需要用EXPWT替换文件1中的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 回复  |  直到 7 年前
        1
  •  1
  •   ZNZNZ    7 年前
    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中记录的第二个字段,其中 non-IND 文件2中的货币,至 EXPWT

    $0英寸 FNR!=1 && $0 && $1 in arr ,将考虑空行

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

        2
  •  0
  •   kvantour    7 年前

    据我所知,您希望:

    • 如果file1中的列1位于file2中的列1中,则将file1中的列2替换为 EXPWT 当且仅当file2中的列2不是 INR

    所以我们的想法是 file2 在阵列中 a 编制索引的人 $1 。我们不存储所有值,但只存储其中的值 $2 != "INR" 。什么时候 文件2 完全索引,我们可以处理 file1 只要检查一下 1美元 在中 。如果是,则进行替换。这可以理解为:

    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")