[英]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
邏輯:
筆記 :
90000 > 20000 然后 20000 * 90000 = 1800000000
90000 < 120000 然后 120000 - 90000 = 30000
您能否再嘗試一次。
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.