Usando grep / sort / find para extrair valores exclusivos

3

Eu tenho um monte de arquivos de texto que são nomeados em YYYYMMDD.Txt format (então hoje seria 20160420.Txt ).

Cada arquivo é basicamente um log que contém um registro de data e hora e um ID exclusivo, cada valor é separado por delimitadores de tabulação.

Por exemplo, 20160420.Txt tem os seguintes valores:

DATE        TIME   ID
20160420   0135   123456
20160420   0240   234567
20160420   1252   345678

Eu preciso extrair todos os IDs únicos presentes nesses arquivos, mas apenas nesses arquivos dos últimos 6 meses.

O problema é que não posso usar o mtime porque todos os arquivos foram recriados novamente na semana passada (por exemplo, o mtime não corresponde ao nome do arquivo).

Existe alguma maneira de fazer isso com grep / find / sort ?

    
por listerblack 20.04.2016 / 19:11

3 respostas

2

Não é trivial encontrar a data exata há 6 meses, especialmente se a data atual for o dia 31 de algum mês. Mas se você sabe como fazer isso com find e -mtime , eu apenas tocaria os arquivos dependendo da data em seus nomes:

for x in *.Txt; do
   dd=${x%.Txt}
   touch -t "$dd"0000 "$x"
done

e, em seguida, use o mtime

    
por 20.04.2016 / 20:06
1

Use awk para fazer o trabalho e SQLite para as datas.

sqlite3 <<< "select date('2016-04-20', '-6 month');"
2015-10-20

Dandy, não é? O awk possui funções de strings para inserir / excluir as necessidades de SQLite dos hífens e, sim, as divisões nos delimitadores de tabulação.

awk 'NR == 1 {next}; { IDS[$3]++ }; END {for (K in IDS) {print K}}' ids
123456
345678
234567

Garantido rápido também.

    
por 21.04.2016 / 06:30
1

Continuando com o comentário de @ cas para outra resposta:

six_months=$(date -d "6 months ago" "+%Y%m%d")
for f in *.Txt; do
    file_date=${f%.Txt}
    [[ $file_date > $six_months ]] && echo "$f"
done |
  xargs awk 'FNR > 1 {print $3}' |
  sort -u > unique_ids_in_last_6_months

O loop for imprime os nomes de arquivos "qualificados". xargs passa os nomes dos arquivos para awk um lote de cada vez (minimizando o número de chamadas para o awk). O awk descarta o cabeçalho e imprime a última coluna. sort encontra os IDs exclusivos para você.

    
por 22.04.2016 / 03:11