Grep correspondência numérica exata

1

Estou usando o grep para extrair alguns números exatos na coluna 2 de um arquivo longo.

Estou usando o seguinte código:

grep  -e "^71161 |^71072 |^72617 " mainfile > outputfile

Isso não faz nada em outputfile

Por favor ajude.

Meu arquivo é assim:

Date        ID  STN     SUPER   LAT     LONG    OBS     VAR
2014060106  71072   146 S000438 48.37   270.68  2   0   
2014060106  71108   12  71108   49.03   237.63  0   0.04
2014060212  71108   12  71108   49.03   237.63  0   0.16    
2014060212  71120   12  71120   54.4    249.73  0   0   
2014060212  71123   12  S000400 53.32   246.42  0   0.11    
2014060212  71125   12  S000961 54.13   251.48  0.05    0.00
2014060212  71140   12  S000388 49.92   260.05  2   0.21    
2014060212  71150   146 71150   50.45   259.4   1   2.21    
    
por Batchguy 06.12.2015 / 22:03

1 resposta

2

awk pode ser uma escolha melhor aqui:

awk 'BEGIN{a[71161] a[71072] a[72617]}; $2 in a' < mainfile

Ou:

awk '$2 ~ /^(72617|71072|71161)$/' < mainfile

Ou:

awk '$2 == "71161" || $2 == "71072" || $2 == "72617"' < mainfile

(Cuidado com as implementações do POSIX awk (não as tipicamente encontradas nas distribuições atuais do Linux), o operador == aplicado às strings testa se as duas strings combinam as mesmas , que podem ser diferente de ser igual a Por exemplo, em um sistema GNU em uma localidade UTF-8, um POSIX awk retornaria verdadeiro para "71161" == "٧١١٦١" , porque nas versões atuais dessas localidades do GNU, os dígitos árabes orientais agrupam o igual aos equivalentes do árabe ocidental (inglês), para evitar que você queira definir LC_ALL para C .

Você também pode fazer comparações numéricas com:

awk '$2 == 71161 || $2 == 71072 || $2 == 72617' < mainfile

Que também retornaria linhas onde o segundo campo é 71161.0 ou 71.161e3 ou 0x115f9 (para GNU awk , você precisa passar POSIXLY_CORRECT no ambiente para números hexadecimais a serem considerados).

    
por 06.12.2015 / 23:55

Tags