【问题标题】:vlookup on csv using all 4 columns from file2 to File1 using awk使用 awk 使用从 file2 到 File1 的所有 4 列对 csv 进行 vlookup
【发布时间】:2018-11-17 10:25:22
【问题描述】:

尝试对 csv 文件的大型数据集的 4 列进行 vlookup

F1 : 文件 1

TSM,TYPE,NODE,SCHED
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

F2

AIXTSM1,VHOST,10.199.114.72,DAILY_1800_VM_SDC-CTL-PROD,YES
AIXTSM1,VHOST,ADMET007,DAILY_1800_VM_SDC-CTL-PROD3,NO
AIXTSM2,VHOST,ADMET014,DAILY_1900_VM_UDC-CTL-PROD,YES
AIXTSM1,VHOST,AGGREGATE4,DAILY_2200_VM_SDC-CTL-PROD5,NA

F1 17 日的期望结果:输入文件 1

TSM,TYPE,NODE,SCHED,2018-11-17
AIXTSM1,VHOST,10.199.114.72,DAILY_1800_VM_SDC-CTL-PROD,YES
AIXTSM1,VHOST,ADMET007,DAILY_1800_VM_SDC-CTL-PROD3,NO
AIXTSM2,VHOST,ADMET014,DAILY_1900_VM_UDC-CTL-PROD,YES
AIXTSM1,VHOST,AGGREGATE,DAILY_2200_VM_SDC-CTL-PROD5,NA

18th F2 执行代码后的期望结果:输入 File1

TSM,TYPE,NODE,SCHED,2018-11-17,2018-11-18
AIXTSM1,VHOST,10.199.114.72,DAILY_1800_VM_SDC-CTL-PROD,YES,YES
AIXTSM1,VHOST,ADMET007,DAILY_1800_VM_SDC-CTL-PROD3,NO,NO
AIXTSM2,VHOST,ADMET014,DAILY_1900_VM_UDC-CTL-PROD,YES,YES
AIXTSM1,VHOST,AGGREGATE,DAILY_2200_VM_SDC-CTL-PROD5,NA,NA

代码

awk -F, -v date=$(date +'%Y-%m-%d') ' BEGIN   { OFS = FS } FNR==NR { a[$1] = $5; next } FNR==1  { n1 = n = NF + 1; $n = date; print; next } { $n1 = ($1 in a) ? a[$1] : "NA"; print }' f2 f1 > t && mv -f t f1

上面的代码结果不正确

【问题讨论】:

  • 能否请您确认您的最后一行是否不是实际结果?由于看起来它们在两个文件中没有共同的 4 个字段,请确认一次。

标签: unix awk ksh


【解决方案1】:

看起来您在预期输出中显示的最后一行似乎没有遵循您显示的规则,请您尝试遵循。

awk -F, -v DAT=$(date +'%Y-%m-%d') '
FNR!=NR && FNR==1{
  print $0","DAT
  next
}
FNR==NR{
  a[$1,$2,$3,$4]=$0
  next
}
{
  $0=(($1,$2,$3,$4) in a)?a[$1,$2,$3,$4]:$0"," $NF ",NA"
}
1
'  Input_file2   Input_file1

附加 > temp_file && mv temp_file Input_file 以防您想将输出保存到 Input_file 本身。

【讨论】:

  • 是的,但是使用结果中的代码跳过最后一行 AIXTSM1,VHOST,AGGREGATE,DAILY_2200_VM_SDC-CTL-PROD5,NA 如何使用代码搜索不区分大小写。
  • @J.RAM,你为什么需要它?我没有得到,因为它的 4 个字段不常见,请解释一下?您还想保存哪个文件输出?
  • @J.RAM,AGGREGATE 在 file1 中,AGGREGATE4 在 file2 中,它们是如何常见的?请解释一次。
  • 如果 4 个字段对于 f1 上的任何行都不常见,如何将代码显示为 NA 以使结果中不匹配的行显示为 NA,是的输出重定向到 Input_file1,请帮助了解它如何从 Inputfile2 打印 $5,在代码 $5 中没有使用。
  • @J.RAM,现在试试我编辑的代码,让我知道吗?我现在也将添加非单线形式的解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多