Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用awk在csv上使用文件2到文件1的所有4列进行vlookup_Unix_Awk_Ksh - Fatal编程技术网

Unix 使用awk在csv上使用文件2到文件1的所有4列进行vlookup

Unix 使用awk在csv上使用文件2到文件1的所有4列进行vlookup,unix,awk,ksh,Unix,Awk,Ksh,尝试在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_

尝试在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

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
在第18个F2上执行代码后的预期结果:输入文件1

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

附加
>临时文件和&mv临时文件输入文件
,以便将输出保存到输入文件本身。

请确认最后一行是否不是实际结果?由于这两个文件中似乎没有4个公共字段,请确认一次。是的,但使用结果AIXTSM1、VHOST、AGGREGATE、DAILY_2200_VM_SDC-CTL-PROD5中的代码跳过了最后一行。如何使用代码搜索不区分大小写。@J.RAM,您为什么需要它?我没有得到,因为它的4个字段不常见,请解释?您还想保存哪个文件的输出?@J.RAM,
AGGREGATE
在文件1中,而
AGGREGATE4
在文件2中,它们是如何常见的?请解释一下。如果f1上的任何一行有4个字段不常见,如何调整结果中不匹配行的代码显示为NA,是的输出被重定向到Input_文件1,请帮助理解它如何从Inputfile2打印$5(代码为$5)而不使用。@J.RAM,请立即尝试我编辑的代码并让我知道?我现在也将添加非线性形式的解决方案。
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
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