Dividir arquivo baseado em um campo de data

0

Eu tenho um arquivo abc.txt . Eu preciso grep o arquivo no campo de data que está presente na posição 4 th no arquivo de texto. Eu preciso dividir o arquivo com base na data de 1 st para 15 th agosto os dados precisam estar em um arquivo e de 16 th para 31 st agosto os dados precisam estar em outro arquivo.

Como posso fazer isso?

a|b|c|08/01/2017|d
a|b|c|08/15/2017|d
a|b|c|08/16/2017|d
a|b|c|08/31/2017|d

Obrigado.

    
por Rak kundra 14.09.2017 / 17:27

4 respostas

2

Este é um trabalho fácil com awk :

awk -F'|' '{print >((substr($4,4,2)<=15)?"1-15Aug":"16-31Aug")}' infile

Isso está verificando se o dia do mês em que a data foi ≤15 no campo # 4 irá gravar as linhas no arquivo 1-15Aug , caso contrário elas serão redirecionadas para o arquivo 16-31Aug usando a condição Ternary.

A saída seria de 2 arquivos:

==> 1-15Aug <==
a|b|c|08/01/2017|d
a|b|c|08/15/2017|d

==> 16-31Aug <==
a|b|c|08/16/2017|d
a|b|c|08/31/2017|d
    
por 14.09.2017 / 17:40
1

Usando sed :

sed -n -e '\#08/01/2017#,\#08/15/2017#w first.out' \
       -e '\#08/16/2017#,\#08/31/2017#w second.out' file.in

Isso gravará todas as linhas entre a linha contendo 08/01/2017 e a que contiver 08/15/2017 (inclusive) no arquivo first.out . Da mesma forma para o segundo intervalo de datas, mas para second.out .

Isso depende do arquivo file.in ser classificado em ordem de data.

O caractere # foi escolhido como o delimitador de padrão, pois o padrão já contém / .

    
por 14.09.2017 / 17:50
1

A abordagem mais curta awk :

awk -F'[|/]' '{print >(($5<=15)?"1-15":"16-31")"Aug"}' file
  • -F'[|/]' - separador de campo complexo

Visualizando resultados:

for f in [0-9]*Aug; do echo "file: $f"; cat "$f"; echo; done

A saída:

file: 1-15Aug
a|b|c|08/01/2017|d
a|b|c|08/15/2017|d

file: 16-31Aug
a|b|c|08/16/2017|d
a|b|c|08/31/2017|d
    
por 14.09.2017 / 18:22
0

Você pode fazer um simples csplit se seus dados estiverem classificados por data.

split -f abc greptest.txt '/08\/16\/2017.*$/'

Ele cortará seu arquivo em dois ao localizar a primeira Linha contendo 08/16/2017 . Eles serão nomeados abc00 e abc01

    
por 14.09.2017 / 17:49