Finden Sie Sequenzen, die in alphabetischer Reihenfolge sind

Finden Sie Sequenzen, die in alphabetischer Reihenfolge sind

Ich möchte alle Sequenzen finden, die in der TXT-Datei in alphabetischer Reihenfolge vorliegen, ohne Sortierung.

Beispiel: Angenommen, die Textdatei sieht folgendermaßen aus:

aedftg
wqof
abcdef
oufn
pqrs
aabcd

Die Ausgabe sollte

abcdef
pqrs

auch ohne sich wiederholende Zeichen wie aabcd.

Antwort1

Eine Option, fest codiert für Englisch:

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

Gutschrift anNinjaBärAffefür die Formulierung der Idee, die in meinem Kopf keimte; ich habe den regulären Ausdruck geändert, um wiederholte Zeichen zuzulassen ( aabcc).

Andere Option:

Die Verwendung von sortzur Überprüfung der lokalspezifischen Sortierreihenfolge ist eine bessere Möglichkeit, damit Sie das Alphabet nicht hart codieren müssen.mikejonesey hat, das bedeutet, dass Sie die Zeichen der Zeile auf separate Zeilen aufteilen müssen. Ich habe das mit einem Shell-Skript gemacht (mit einer modernen Shell, die Teilstring-Erweiterung unterstützt), um den Aufruf von sed zu vermeiden, und das außerdem die sortOption -c verwendet, um anzugeben, ob die Eingabe bereits sortiert ist oder nicht:

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

Wenn sorteine Diskrepanz gefunden wird, erfolgt die Ausgabe an stderr, aber für uns ist nur der Rückgabecode von Belang, deshalb lösche ich stderr.

Eine Demonstration mit einer nicht-englischen Eingabe (die $Zeichen sind die Shell-Eingabeaufforderungen):

$ cat input
αβγα
αβγ
$ ./sorted2 < input
αβγ
$

Antwort2

Nur der Vollständigkeit halber eine awk-basierte Lösung, bei der die übliche Beziehung zwischen Muster und Daten vertauscht ist:

awk 'BEGIN{ref="abcdefghijklmnopqrstuvwxyz"} ref ~ $0' file.txt

Dadurch werden die Zeilen in der Datei als reguläre Ausdrücke interpretiert, mit denen die „Referenz“-Zeichenfolge sortierter Zeichen von abis zverglichen wird. Nur wenn eine Übereinstimmung vorliegt (d. h. die Zeichenfolge in der Zeile ist eine Teilzeichenfolge von a ... z), wird die Zeile gedruckt.

Antwort3

perl -MPOSIX -Mopen=locale -lne '
   print unless m{(.)(.)(?(?{strcoll($1, $2) < 0})(*FAIL))}' < file

Würde die Zeilen drucken, fileaußer denen, die ein Zeichen enthalten, das im Gebietsschema des Benutzers nach dem vorherigen nicht sortiert wird.

Antwort4

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: Wenn Sie den Sortierbefehl nicht verwenden möchten, können Sie jedes Zeichen in eine Ganzzahl konvertieren und mit einer If-Anweisung überprüfen, ob das letzte Zeichen kleiner ist als das nächste.

verwandte Informationen