
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 sort
zur Ü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 sort
Option -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 sort
eine 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 a
bis z
verglichen 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, file
auß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.