アルファベット順の検索

アルファベット順の検索

ソートせずにtxtファイル内のすべてのシーケンスをアルファベット順に探したいと思います。

例:テキストファイルが次のようになっているとします。

aedftg
wqof
abcdef
oufn
pqrs
aabcd

出力は

abcdef
pqrs

のように繰り返される文字もありませんaabcd

答え1

オプションの1つ(英語でハードコードされています):

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

~に帰属忍者クマ猿頭の中から浮かぶアイデアを明確にしました。繰り返し文字(aabcc)を受け入れるように正規表現を変更しました。

別のオプション:

sortより良いアプローチは、アルファベットをハードコードする必要がないように、ロケール固有の照合チェックを使用することです。 〜のようにマイク・ジョーンズがやったは、その行の文字を別々の行に分割する必要があることを意味します。 sed呼び出しを防ぐために、シェルスクリプト(部分文字列拡張をサポートする最新のシェルを使用)を使用し、sort-cオプションを使用して入力がソートされているかどうかを示します。

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

違いが見つかるとsortstderrに出力しますが、我々は戻りコードだけを気にするのでstderrを削除しました。

英語以外の入力デモ($文字はシェルプロンプトです):

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

答え2

完全性のために、awkスキーマとデータの一般的な関係が交換されるベースのソリューションは次のとおりです。

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

これは、ファイルの行をからのa整列文字の「参照」文字列zと一致する正規表現として解釈します。一致するものがある場合にのみa ... z行が印刷されます(つまり、行の文字列がの部分文字列であることを意味します)。

答え3

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

fileユーザーロケールでは、前の文字の後に並べ替えられていない文字を含む行を除いて、行が印刷されます。

答え4

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...sort コマンドを使用したくない場合は、各文字を int に変換し、if ステートメントを使用して、最後の文字が次の文字より小さいことを確認できます。

関連情報