
Quero encontrar todas as sequências que estão em ordem alfabética em arquivo txt, sem ordenação.
Exemplo: supondo que o arquivo de texto tenha esta aparência:
aedftg
wqof
abcdef
oufn
pqrs
aabcd
a saída deve ser
abcdef
pqrs
também sem repetir caracteres como aabcd
.
Responder1
Uma opção, codificada para inglês:
grep -ix 'a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*' input
Crédito paraUrso Ninja Macacopor explicitar a ideia que germinava na minha cabeça; Modifiquei o regex para permitir caracteres repetidos ( aabcc
).
Outra opção:
Usar sort
para verificar a ordem de agrupamento específica do local é a melhor maneira de fazer isso, para que você não precise codificar o alfabeto. Comomikejonesey fez, isso significa que você deve dividir os caracteres da linha em linhas separadas. Eu fiz isso com um script de shell (usando um shell moderno que suporta expansão de substring) para evitar a chamada para sed, e que também usa a sort
opção -c de para indicar se a entrada já está classificada ou não:
while IFS= read -r line
do
for((i=0; i < ${#line}; i++))
do
printf '%s\n' "${line:i:1}"
done | sort -c 2>/dev/null && printf '%s\n' "$line"
done
Se sort
encontrar uma discrepância, a saída será para stderr, mas nos preocupamos apenas com o código de retorno, então descarto stderr.
Uma demonstração com entrada diferente do inglês (os $
caracteres são os prompts do shell):
$ cat input
αβγα
αβγ
$ ./sorted2 < input
αβγ
$
Responder2
Apenas para completar, uma awk
solução baseada em -, onde a relação usual de padrão e dados é trocada:
awk 'BEGIN{ref="abcdefghijklmnopqrstuvwxyz"} ref ~ $0' file.txt
Isso interpretará as linhas do arquivo como expressões regulares com as quais a sequência de "referência" de caracteres classificados de até a
é z
comparada. Somente se houver uma correspondência (o que significa que a string na linha é uma substring de a ... z
) a linha será impressa.
Responder3
perl -MPOSIX -Mopen=locale -lne '
print unless m{(.)(.)(?(?{strcoll($1, $2) < 0})(*FAIL))}' < file
Imprimiria as linhas file
exceto aquelas que contêm um caractere que não é agrupado após o anterior na localidade do usuário.
Responder4
cat homework.txt | while read aline; do
stringORIG=$(echo -n "$aline" | sed 's/\(.\)/\1\n/g')
stringABC=$(echo -n "$aline" | sed 's/\(.\)/\1\n/g' | sort)
if [ "$stringORIG" == "$stringABC" ]; then
echo "$aline"
fi
done
.
abcdef
pqrs
ps... se você não quiser usar o comando sort, você pode converter cada caractere em int e ter uma instrução if para verificar se o último caractere é menor que o próximo...