[英]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.