Como posso obter linhas com colunas específicas e padrões específicos?

2

Eu tenho um arquivo csv parecido com isto: (segunda coluna é padrão de data)

qqq.eee,2015-10-12
rrr-ttt,2015-11-23
aaapppp,2022-01-10
ddd_fff,2017-05-23
zzzbbbb,2013-09-20
nnnmmmm,2015-06-17
wwwwwww,2014-11-20
uuu-uuu,2016-12-10
ppppppp,2015-10-19
kkkkkkk,2016-12-25

Eu quero obter linhas com a segunda coluna correspondente da seguinte forma:

year between two number(for example): 2014<= year =<2016
month between two number(for example): 10<= month =<12
day between two number(for example): 20<= day =<30

e, em seguida, obter a saída da seguinte forma:

rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25

Isso é possível com o awk?

    
por alrz 24.12.2016 / 09:10

2 respostas

2

Eu apenas comparo do final ao começo por causa dos separadores

awk -F[-,] '$NF >= 20 && $NF <= 30 && $(NF-1) >= 10 && 
            $(NF-1) <= 12 && $(NF-2) >= 2014 && $(NF-2) <= 2016' yourfile
  1. NF é o último campo e $NF é o valor, e $(NF-1) é o valor do campo antes do último e assim por diante
  2. $NF dia, $(NF-1) mês, $(NF-2) ano
por 24.12.2016 / 09:41
4

awk é mais adequado para filtragem de colunas e várias condições. No entanto, esse problema em particular também pode ser resolvido com grep

$ grep -E '201[4-6]-1[0-2]-(2[0-9]|30)$' ip.csv 
rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25
  • -E usa expressões regulares estendidas
  • 201[4-6] de 2014 a 2016
  • 1[0-2] intervalo de 10 a 12
  • 2[0-9] intervalo de 20 a 29
    • usando agrupamento e alternação, (2[0-9]|30) fornece o intervalo de 20 a 30
  • $ fim da linha
  • outras leituras: link
por 24.12.2016 / 09:58