Parece que você quer um sistema de pontuação.
Escreva um script para atribuir uma pontuação a cada linha,
indicando quão cedo a saída você quer ver.
awk
parece bem adequado para este trabalho.
Por exemplo:
#!/bin/sh
awk '{score=0}
/usb/ {score=1}
/Plantronics/ {score=2}
{print score, NR, $0}' "$@"
Isso atribui uma pontuação de 0 a cada linha por padrão
e, em seguida, substitui-o por um 1 se a linha contiver usb
e 2 se a linha contiver Plantronics
.
Coloquei as instruções usb
e Plantronics
nessa ordem,
se uma linha contiver ambas as strings, o valor final será 2. Então
./score file.txt | sort -k1nr -k2n | cut -d" " -f3-
(onde score
é o nome do script).
sort -k1nr
significa classificar com base no primeiro campo (a pontuação),
tratando-o como um número e classificando os valores mais altos primeiro
(porque o script score
atribuiu pontuações altas às linhas
você está mais interessado em).
-k2n
significa, para linhas que possuem o mesmo valor no primeiro campo,
classificar pelo segundo campo, como um número em ordem normal e crescente.
O segundo campo é NR
, o número do registro (a.k.a. line number).
Isso garante que as linhas com a mesma pontuação
(por exemplo, aqueles que contêm usb
, mas não Plantronics
)
sai em sua ordem original.
Se você não se importa com isso, exclua a declaração NR,
da print
,
exclua o -k2n
do comando sort
e altere o -f3-
para -f2-
.
(Na verdade, sort
pode preservar a ordem assim por padrão,
então você pode não precisar disso.)
Claro que o cut -d" " -f3-
retira os números
que o script score
foi adicionado aos dados.
Se você não entender como isso funciona, tente executar
./score file.txt
e
./score file.txt | sort -k1nr -k2n
Essa abordagem é bastante flexível. Por exemplo, o código acima produzirá, em ordem,
- todas as linhas contendo
Plantronics
, - todas as linhas contendo
usb
(mas nãoPlantronics
) e - todas as linhas que não contêm nenhum dos itens acima
com cada grupo classificado em ordem de aparição no arquivo de entrada.
Mas, alterando o script score
da seguinte maneira,
#!/bin/sh
awk '{score=0}
/usb/ {score+=1}
/Plantronics/ {score+=2}
{print score, NR, $0}' "$@"
podemos atribuir uma pontuação de 3 a linhas que contenham ambas as strings, então agora temos
- todas as linhas que contêm
Plantronics
eusb
, seguidas por - todas as linhas que contêm
Plantronics
(mas nãousb
), seguidas por - todas as linhas que contêm
usb
(mas nãoPlantronics
) e, em seguida, - todas as linhas que não contêm nenhuma das opções acima.