Quebrando instrução awk ao procurar um padrão em um arquivo

0

Eu tenho um arquivo de 33 GB. Neste arquivo, a primeira coluna é o código do país (por exemplo: AT, BE, CA, DE, DK, GB, IE, IT etc.). Estou usando o comando awk como o abaixo:

awk -F"|" '$1~/^AT/ {print $0}'

Este comando funciona bem. Mas está demorando quase 1 hora e meia enquanto o awk lê o arquivo inteiro.

Existe uma maneira de quebrar o comando awk quando terminar de procurar um padrão.

Exemplo: Quando terminar de pesquisar por AT, ele deverá interromper a pesquisa no restante do arquivo.

O arquivo que estou usando é classificado.

    
por royal23enfield 18.04.2017 / 18:53

3 respostas

1

Se você souber o próximo código no arquivo,

awk '/^BE/ { exit }; /^AT/' file

Observe também como a opção -F não é realmente útil nesse cenário isolado e como a ação padrão { print $0 } nunca precisa ser explicitamente fornecida se essa for a ação específica desejada.

Se você precisar fazer isso repetidamente, um único script que extraia as seções que você deseja separar arquivos em uma única passagem pelo arquivo original seria obviamente mais eficiente. Se você quiser extrair todos eles (ou uma parte dominante), veja também csplit (talvez apague os arquivos que você não precisa depois de extrair todos eles?)

    
por 18.04.2017 / 20:00
1

Como o arquivo está classificado, você pode usar a comparação de strings para sair quando o primeiro campo for classificado após o que você está procurando.

awk -F"|" '$1 ~ /^AT/ {print $0} $1 > "AT" {exit}'

É claro que isso não tornará mais rápido encontrar a primeira ocorrência de um código no final do alfabeto, então pode ser uma boa ideia considerar algo mais sofisticado com a indexação adequada.

    
por 18.04.2017 / 19:23
0

Claro, basta adicionar exit :

awk -F"|" '$1~/^AT/ {print $0; exit}'

Isso fará com que ele saia assim que encontrar a primeira linha cujo primeiro campo começa com AT . Se você quiser que ele pare assim que encontrar a primeira linha cujo primeiro campo não começa com AT , você pode usar:

awk -F"|" '{if($1~/^AT/){print $0}else{exit}}' 

E se você pode ter linhas que não começam com AT antes da primeira que faz e você quer parar depois que as linhas que começam com AT foram impressas, use:

awk -F"|" '{if($1~/^AT/){print $0; a=1}else if(a==1){exit}}'  
    
por 18.04.2017 / 19:24

Tags