将子字符串保存在重复模式旁边(重击)

时间:2018-07-24 20:30:24

标签: bash

我的文件如下:

__1 AAA =====
__2 BBB =====
__3 CCC =====
_10 DDD =====
_11 BBB =====
_14 EEE =====
_15 BBB =====
_20 CCC =====

下划线试图在我的文件中表示空格(空白)。

因为三行带有模式BBB,两行带有模式CCC,我需要在它们的左侧保存伴随它们的数字(如果可能,将它们保存在不同的变量中),但是最高数字(不是最低数字)。因此,数字将是(我文件的输出):

11
15
20

(请注意,对于所有其他寄存器,只有一个寄存器,因此我不需要任何编号)

1 个答案:

答案 0 :(得分:1)

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4.0 required" >&2; exit 1;; esac

declare -A highest=( ) count=( )
while read -r num pat _; do : num="$num" pat="$pat"
  (( ++count[$pat] ))
  if [[ -z ${highest[$pat]} ]] || (( num > ${highest[$pat]} )); then
    highest[$pat]=$num
  fi
done

readarray -t sorted_keys < <(printf '%s\n' "${!highest[@]}" | sort)

for key in "${sorted_keys[@]}"; do : key="$key"
  if (( ${count[$key]} > 1 )); then
    printf '%s\n' "${highest[$key]}"
  fi
done