要从列中查找最大值和最小值并在其他列

时间:2018-05-07 08:44:21

标签: linux bash awk scripting

需要您的支持以下。请帮忙

如果第5列是INV,那么只考虑column1并从column1中取出重复/相同的行/值,然后在column7中放入column6的最小值,并在第8列中放入最大值,然后需要从第7列中减去第7列的值第8列,然后加1,得到结果并将最终结果存储在第9列和第11列。 还需要在输出文件

中省略/删除列(第5列和第6列)

例如在输入文件27AAACH1458C1ZZ中是6次,但是需要考虑仅5行,因为第5列中的一行具有我们需要丢弃的值REVERSED(需要考虑列5具有值“INV”的行)。

因此在7行中,在第6列中,最小值将为“IN27201800023182”,最大值将为“IN27201800024289”,因此需要在第7列中设置最小值,在第8列中设置最大值。

此后需要考虑来自列(7和8)的最后8位数字并从第8列中减去第7列。然后需要将/加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 :(得分:0)

这个脚本:

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