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
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?
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
Outra solução awk :
awk -F'|' '{if ($2 == "abcd") { l=1} else if ($2 == "abcg") { l=0} }l' file
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'
grava no intervalo de abcd - abcf usando grep
:
grep -E '^[^\|]+\|abc[d-f]\|'
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;}'