AWK, сравните два файла, затем сравните другое поле для совпадения и сделайте арифметику - PullRequest
0 голосов
/ 09 ноября 2018

Файл 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 </p>

    1. Отображение вывода, как указано выше

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018
$ 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 (для значения).

0 голосов
/ 09 ноября 2018

Использование 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
> 
0 голосов
/ 09 ноября 2018

Не могли бы вы попробовать один раз.

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
...