【问题标题】:Comparing Only First 4 columns from File1 (CSV Formatted ) to First 4 columns in File2 and printing all columns from File1 i仅比较 File1 中的前 4 列(CSV 格式)与 File2 中的前 4 列并打印 File1 i 中的所有列
【发布时间】:2018-11-17 02:27:31
【问题描述】:

我正在尝试比较两个 CSV 格式的文件

第一个文件是动态的,每天都会添加列, 在第二个文件上它只有 4 列(静态) 将 File1 上的前 4 列与 File2 上的 4 列进行比较,并打印 File1 中与 File2 匹配的所有列

例如:

文件1

AIXTSM1,VHOST,10.199.114.72,DAILY_1800_VM_SDC-CTL-PROD3,COMP,COMP,COMP
AIXTSM1,VHOST,ADMET007,DAILY_1800_VM_SDC-CTL-PROD3,COMP,COMP,COMP
AIXTSM2,VHOST,ADMET014,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM1,VHOST,AGGREGATE,DAILY_2200_VM_SDC-CTL-PROD5,COMP,COMP,COMP
AIXTSM1,PHOST,APLEE01,DAILY_2000_SU_W3,COMP,COMP,COMP
AIXTSM1,PHOST,APYRK02,DAILY_2000_SU_W3,COMP,COMP,COMP
AIXTSM2,PHOST,APYRK04,DAILY_1800_V7K,COMP,COMP,COMP
AIXTSM1,VHOST,ARCLIC01,DAILY_2200_VM_SDC-CTL-PROD5,COMP,COMP,COMP
AIXTSM2,PHOST,ARIELN,DAILY_1800_V7K,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET005,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM2,PHOST,ASMET014,WIN_INCRE_2000,COMP,COMP,COMP
AIXTSM1,VHOST,ASMET038,DAILY_1800_VM_SDC-CTL-PROD2,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET042,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM1,VHOST,ASMET044,DAILY_1800_VM_SDC-CTL-PROD3,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET046,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET068,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET069,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET070,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET071,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET072,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM2,VHOST,ASMET073,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP
AIXTSM1,PHOST,ASMET074,DAILY_INCR_1900,COMP,COMP,COMP
AIXTSM1,VHOST,ASMET084-T,DAILY_1800_VM_SDC-CTL-PROD3,COMP,COMP,COMP

文件2

AIXTSM1,VHOST,10.199.114.72,DAILY_1800_VM_SDC-CTL-PROD
AIXTSM1,VHOST,ADMET007,DAILY_1800_VM_SDC-CTL-PROD3
AIXTSM2,VHOST,ADMET014,DAILY_1900_VM_UDC-CTL-PROD
AIXTSM1,VHOST,AGGREGATE,DAILY_2200_VM_SDC-CTL-PROD5

结果

AIXTSM1,VHOST,10.199.114.72,DAILY_1800_VM_SDC-CTL-PROD3,COMP,COMP,COMP,OK
AIXTSM1,VHOST,ADMET007,DAILY_1800_VM_SDC-CTL-PROD3,COMP,COMP,COMP,OK
AIXTSM2,VHOST,ADMET014,DAILY_1900_VM_UDC-CTL-PROD,COMP,COMP,COMP,OK
AIXTSM1,VHOST,AGGREGATE,DAILY_2200_VM_SDC-CTL-PROD5,COMP,COMP,COMP,OK

代码

awk -F, 'NR==FNR{ arr[$2]=$1 $2 $3 $4; next } { print $0, (arr[$2]==$1 $2 $3 $4?"OK":"NOK") }' OFS=, File2 File1 

但它只匹配第一行。

【问题讨论】:

  • 您的文件2,第一行末尾缺少“3”。

标签: awk


【解决方案1】:

我相信您的预期输出的第一行是错字?由于 Input_file2 的所有 4 个字段都没有进入 Input_file1。请您尝试关注一下。

awk 'BEGIN{FS=OFS=","}FNR==NR{a[$1,$2,$3,$4];next} (($1,$2,$3,$4) in a){print $0, "OK"}' Input_file2  Input_file1

说明:这里也为上述代码添加说明。

awk -F, '                ##Mentioning field separator as comma(,) here for all lines of Input_file(s).
BEGIN{                   ##Starting BEGIN section of awk program here.
  FS=OFS=","             ##Setting field separator and output field separator as comma(,) here.
}
FNR==NR{                 ##FNR==NR condition will be when 1st Input_file named Input_file2 is being read.
  a[$1,$2,$3,$4]         ##Creating an array named a whose index is $1,$2,$3,$4 fields of Input_file2 lines.
  next                   ##next will skip all further statements from here.
}                        ##Closing first condition block now.
(($1,$2,$3,$4) in a){    ##Checking condition if $1,$2,$3,$4 of Input_file1 are present in array a if yes then do following.
  print $0,"OK"          ##Printing current line with OFS and OK string here now.
}
' Input_file2  Input_file1   ##Mentioning Input_file name(s) Input_file2 and Input_file1 here.

【讨论】:

  • 谢谢,您的解释有助于更好地理解
  • @XYZ,很高兴它对您有所帮助,继续在伟大的网站上发帖并继续学习。
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 2016-02-09
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多