Отображение Самой последней строки по ключу

Поскольку порядок версий совпадает с лексическим порядком в вашем случае, с POSIX shell:

set -- ABC_XYZ_RMG_19951223_HANSHAKE_V*.flg
# now $1, $2... contain the files from the lowest version to highest.

shift "$(($# - 1))"
highest_version=$1

# or without shift:
eval "highest_version=\${$#}"

Или с zsh или последними версиями bash:

rmgs=(ABC_XYZ_RMG_19951223_HANSHAKE_V*.flg)
highest_version=${rmgs[-1]}

Чтобы сделать это с каждым файлом в текущем каталоге (снова с помощью zsh или последних версий bash (4. 0 или выше)):

highest_versions() (
  cd -P -- "$TEMP" || exit
  typeset -A a
  for f in *V??.flg; do
    a[${f%V??.flg}]=$f
  done
  printf '%s\n' "${a[@]}"
)

На ваших файлах это дает:

ABC_XYZ_STRIP_FULLREVAL_YU_1234_19951223_HANSHAKE_V03.flg
ABC_XYZ_RMG_19951223_HANSHAKE_V11.flg
ABC_JANE_PICK_AMTY_19951223_HANSHAKE_V02.flg
ABC_XYZ_ALG0_19951223_HANSHAKE_V02.flg
ABC_XYZ_SGFXMM_19951223_HANSHAKE_V03.flg
ABC_RFTY_PICK_AMTY_19951223_HANSHAKE_V03.flg
ABC_EFG_FLOOL_DR3GCTEU_19951223_HANSHAKE_V03.flg
ABC_EFG_FLOOL_DR3GCTPC_19951223_HANSHAKE_V03.flg

С оболочками, которые не поддерживают ассоциативные массивы, вы можете сделать то же самое, вызвав инструмент, который это делает, например awk:

highest_versions() (
  cd -P -- "$TEMP" || exit
  awk 'BEGIN{
    for (i = 1; i < ARGC; i++) {
      key = val = ARGV[i]
      sub(/V..\.flg/, "", key)
      a[key] = val
    }
    for (i in a) print a[i]
    exit}' *V??.flg
)
3
14.08.2018, 19:10
2 ответа
awk '{ data[$1] = $0 } END { for (key in data) print data[key] }' file

Это позволит сохранить данные каждой строки в массиве data, введенные в первом поле. Когда обнаруживается другая строка с таким же первым полем, старые данные для этого ключа просто перезаписываются.

В конце выводятся все данные массива.

Более эффективное использование памяти:

sort -k1,1 -s file |
awk 'NR > 1 && $1 != key { print data } { data = $0; key = $1 } END { print data }'

Здесь мы сначала сортируем файл только по первому столбцу, используя алгоритм стабильной сортировки (-s). Использование стабильного алгоритма сортировки означает, что строки с одним и тем же ключом не будут менять положение относительно друг друга в выводе sort.

Затем код awkдолжен только отслеживать «текущий ключ» и последние данные для этого ключа и печатать эти данные при изменении ключа (и в конце ).

1
27.01.2020, 21:29

Я бы перевернул файл, вывел бы каждую строку в первый раз, когда она была замечена, а затем перевернул бы вывод

tac file | awk '!seen[$1]++' | tac
0
27.01.2020, 21:29

Теги

Похожие вопросы