Agarre linhas de um arquivo delimitado com base em uma faixa alfabética

1

O problema pelo qual estou trabalhando é que tenho um arquivo que conterá campos delimitados por um "|" e o arquivo é classificado com base em um desses campos. O que eu tenho tentado criar é uma maneira de pegar linhas com base em um intervalo de um determinado campo.

um exemplo:

A entrada de exemplo seria algo como isso, onde é classificada com base no segundo campo. Então eles estão listados em ordem alfabética

1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd
9876|abcg|57fshde

O intervalo que eu quero obter seria "queremos que todos os registros que caem no intervalo de abcd - abcf sejam gravados em um arquivo diferente. E os registros restantes seriam:

1234|abcd|3fgbe32
1234|abce|5fasdf33
5678|abcf|t438fjd

Quando comecei, acho que me aproximei disso da maneira errada. Eu estava passando por cada linha e, em seguida, tentando verificar a linha contra uma expressão regular para ver se eu queria a linha ou não. Mas haveria uma maneira melhor de fazer isso usando awk e grep?

    
por Jon Z 23.10.2017 / 17:16

5 respostas

3

all records that fall in the range of abcd - abcf

Solução simples awk :

awk -F'|' '$2~/^abc[d-f]$/' file

A saída:

1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd
    
por 23.10.2017 / 17:20
0

Outra solução :

awk -F'|' '{if ($2 == "abcd") { l=1} else if ($2 == "abcg") { l=0} }l' file 
    
por 23.10.2017 / 17:25
0

Uma solução sed .

Para excluir as linhas antes da primeira no intervalo:

cat file | sed '/abcd/Q'

Para excluir as linhas após a última no intervalo:

cat file | sed -n '/abcf/,$p'

   -n : don't print non-matches
   ,$ : first match to end of file
   p  : print

Colocando juntos:

cat file | sed '/abcd/Q | sed -n '/abcf/,$p'

Os padrões corresponderão a qualquer campo na linha, então você precisaria de um padrão melhor para corresponder apenas ao segundo campo:

cat file | sed -r -n '/^[^\|]+\|abcd/,$p' | sed -r '/^[^\|]+\|abce/Q'

O alcance muito simples usando sed seria:

cat file | sed -n '/abc[def]/p'
    
por 23.10.2017 / 17:46
0

grava no intervalo de abcd - abcf usando grep :

grep -E '^[^\|]+\|abc[d-f]\|'
    
por 23.10.2017 / 18:01
0

All-in-one sed solution, gravando o intervalo de abcd a abcf em um arquivo chamado other , enquanto as linhas restantes são passadas para stdout. Então você não precisa passar pelo arquivo duas vezes.

sed -e '/|abcd|/,/|abcf|/{wother' -e 'd;}'
    
por 23.10.2017 / 18:20

Tags