Awk, чтобы найти максимум и минимум из столбца и сохранить в другом столбце - PullRequest
0 голосов
/ 07 мая 2018

Нужна ваша поддержка ниже. Пожалуйста, помогите

Если для столбца 5 задано значение INV, то следует учитывать только столбец 1 и вынимать дубликаты / идентичные строки / значения из столбца 1, а затем помещать минимальное значение столбца 6 в столбец 7 и помещать максимальное значение в столбец 8, а затем необходимо вычесть значения столбца 7 из столбец 8 и затем плюс один, чтобы привести и сохранить окончательный результат в столбце 9 и столбце 11. Также необходимо пропустить / удалить столбец (столбец 5 и столбец 6) в выходном файле

Например, во входном файле 27AAACH1458C1ZZ 6 раз, но нужно учитывать только 5 строк, так как одна строка в столбце 5 имеет значение REVERSED, которое нам необходимо отбросить (необходимо учитывать строки, где в столбце 5 есть значения «INV»).

Таким образом, среди 7 строк в столбце 6 минимальное значение будет «IN27201800023182», а максимальное - «IN27201800024289», поэтому необходимо указать минимум в столбце 7 и максимум в столбце8.

После этого необходимо учитывать последние 8 цифр из столбца (7 и 8) и вычитать столбец 7 из столбца 8. Затем нужно добавить / плюс 1 к результату вычитания и сохранить в столбце 9 и столбце 11. Необходимо пропустить / удалить столбец 5 и столбец 6 в выходном файле.

    a|b|c|d|e|f|g|h|i|j|k
    27AAAC8C1ZZ|042018|||INV|IN27201800023521|||||
    27AAAC8C1ZZ|042018|||INV|IN27201800024289|||||
    27AAAC8C1ZZ|042018|||INV|IN27201800023356|||||
    27AAAC8C1ZZ|032018|||REVERSED|IN27201800022431|||||
    27AAAC8C1ZZ|042018|||INV|IN27201800023400|||||
    27AAAC8C1ZZ|042018|||INV|IN27201800023182|||||

вывод должен быть

a|b|c|d|Min|Max|result|j|result
27AAAC8C1ZZ|042018|||N27201800023182|IN27201800024289|1108||1108

Код я пытаюсь найти максимальное и минимальное значение, но получаю неправильный вывод.

 awk 'BEGIN{OFS=FS="|"} {if ($5=="INV"){ getline; min=$6;max=$6}}
          {(min>$6)?min=$7:"";(max>$6)?"":max=$8}
     END{print min, max}' input.txt

Неверный вывод

IN27201800023182|

1 Ответ

0 голосов
/ 07 мая 2018

Этот скрипт:

awk 'BEGIN{
  OFS=FS="|";
  getline;
  saved=$1"|"$2; # saved for output
  min=substr($6,3); # initial min and max values
  max=substr($6,3);
}
{
  if ($5 == "INV") { # if column $5 is INC
    if (min > substr($6,3)) { min=substr($6,3); }; 
    if (max < substr($6,3)) { max=substr($6,3); }; 
  }
}
END{
  result=max-min+1;
  print saved,"","","IN"min,"IN"max,result,result;
}' \
input.txt

выходы:

27AAAC8C1ZZ|042018|||N27201800023182|IN27201800024289|1108|1108
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...