AWK,比较两个文件,然后比较另一个字段以进行匹配并进行算术

时间:2018-11-09 03:42:55

标签: shell unix awk compare

文件A

Jimmy|03-OCT-18|BST100114261|20000
Dedi|03-OCT-18|BST100904288|10000
Jimmy|03-OCT-18|BST100114262|120000

文件B

Anton|9800
Jimmy|90000

输出

Jimmy|20000|90000|1800000000|BST100114261
Jimmy|120000|90000|30000|BST100114262

逻辑:

  1. 找到同一个吉米
  2. 比较文件A(第4列)和文件B(第2列)的数量,如果文件A(第4列)小于文件B(第2列),则多个文件A(第4列)和文件B(第2列) 。如果较小,则减去文件A(第4列)和文件B(第2列)

注意:

  • 90000> 20000,然后20000 * 90000 = 1800000000

  • 90000 <120000,然后120000-90000 = 30000

    1. 如上显示输出

3 个答案:

答案 0 :(得分:0)

请您尝试一次。

awk '
BEGIN{
  FS=OFS="|"
}
FNR==NR{
  a[$1]=$2
  next
}
($1 in a){
  if($4<a[$1]){
     val=$4*a[$1]
     if(val<a[$1]){
       val_new=$4-a[$1]
     }
  }
  else{
     val=$4-a[$1]
  }
  print $1,$4,a[$1],val_new?val_new:val,$3
  val_new=val=""
}
' Input_fileb   Input_filea

输出如下(仅在提供样本的情况下进行测试,以防万一,请告知我们)

Jimmy|20000|90000|1800000000|BST100114261
Jimmy|120000|90000|30000|BST100114262

答案 1 :(得分:0)

$ awk 'BEGIN   {FS=OFS="|"} 
       NR==FNR {a[$1]=$2;next} 
       $1 in a {v=a[$1]; print $1,$4,v,(v>$4?$4*v:$4-v),$3}' b a

Jimmy|20000|90000|1800000000|BST100114261
Jimmy|120000|90000|30000|BST100114262

说明

  

设置用于分析和打印字段的定界符

     

在扫描行号和文件行号相等的第一个文件(文件b)时,用键值对填充查找数组。

     扫描时

  第二个文件(现在是脚本中的第三个语句),如果键在   在数组中,按所需顺序打印字段,并使用   计算。

     

要不多次重写a[$1],请将其分配给   变量v(用于值)。

答案 2 :(得分:0)

使用Perl单线版

> cat filea
Jimmy|03-OCT-18|BST100114261|20000
Dedi|03-OCT-18|BST100904288|10000
Jimmy|03-OCT-18|BST100114262|120000
> cat fileb
Anton|9800
Jimmy|90000
> perl -F"\|" -lane ' BEGIN { %kvp=map{chomp;split(/\|/)} qx(cat fileb)} { chomp;print "$F[0]|$F[3]|$kvp{$F[0]}|",$F[3]<$kvp{$F[0]}?$F[3]*$kvp{$F[0]}:$F[3]-$kvp{$F[0]},"|$F[2]" if $kvp{$F[0]} } ' filea
Jimmy|20000|90000|1800000000|BST100114261
Jimmy|120000|90000|30000|BST100114262
>