encontrar sequências que estão em ordem alfabética

encontrar sequências que estão em ordem alfabética

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 sortpara 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 sortopçã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 sortencontrar 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 awksoluçã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é zcomparada. 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 fileexceto 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...

informação relacionada