簡體   English   中英

AWK,比較兩個文件,然后比較匹配的另一個字段並進行算術運算

[英]AWK, Compare of two files then compare the other field for the match one and do arithmetic

文件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. 顯示輸出如上

您能否再嘗試一次。

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
$ 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 (用於值)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM