文件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
答案 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
>