Obtenha o arquivo com o ano máximo do mês

0

Eu tenho um requisito para obter o arquivo com o máximo de um ano.

Temos arquivos em um diretório conforme abaixo:

Zmx_0416_control.txt
Zmx_0316_control.txt

Agora, a partir desses arquivos, eu preciso pegar o arquivo Zmx_0416_control.txt como ele pertence a abr de 2016.

Eu preciso de um comando Unix para identificar o arquivo max ( Zmx_0416_control.txt ) da lista de arquivos.

    
por bhaskar 18.04.2016 / 17:17

3 respostas

1

Você pode usar sort :

ls Zmx* | sort -k 1.7n -k 1.5,1.6n

ou

ls Zmx* | sort -t _ -k 2.3n -k 2,2.2n

Com um% final| tail -1

Da classificação do GNU:

  • comparison :

    “[…] A pair of lines is compared as follows: sort compares each pair of fields, in the order specified on the command line, according to the associated ordering options, until a difference is found or no fields are left. […]”

  • index-sort-field

Veja também classificação POSIX .

    
por 18.04.2016 / 17:41
1

solução não tão elegante:

converta% m% y para 100 * y + m, por exemplo: 0416- > 1604, e compare por valor numérico.

for i in Z*
do
  # convert %m%y to 100*y+m
  current=$((100 * $(echo "$i"|cut -c 7-8) + $(echo "$i"|cut -c 5-6)))
  if [[ $current > $max ]]; then
    max=$current
    maxstr=$i
  fi
done

echo $maxstr
    
por 18.04.2016 / 17:34
0

Você pode usar duas variáveis para manter o nome e a parte do arquivo a comparar:

max=; f=; { for i in *.txt; do d="$(cut -d_ -f2 <<<"$i")"; \
  d_s="$(sed 's/\(..\)\(..\)//' <<<"$d")"; \
    [ "$d_s" -gt "$max" ] && max="$d_s" && f="$i"; done ;} && echo "$f"
  • max contém o máximo atual ao percorrer nomes de arquivos

  • f contém o nome do arquivo enquanto percorre

  • cut considera o segundo campo separado por _

  • sed é usado para trocar o mês e o ano para comparação

Exemplo:

$ ls -1                                                                                                                                                                      
foobar
Zmx_0316_control.txt
Zmx_0416_control.txt
Zmx_0716_control.txt

$ max=; f=; { for i in *.txt; do d="$(cut -d_ -f2 <<<"$i")"; d_s="$(sed 's/\(..\)\(..\)//' <<<"$d")"; [ "$d_s" -gt "$max" ] && max="$d_s" && f="$i"; done ;} && echo "$f"
Zmx_0716_control.txt
    
por 18.04.2016 / 17:33