アルファベット順のシーケンスを検索する

アルファベット順のシーケンスを検索する

ソートせずに、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がより良い方法です。mikejoneseyはつまり、行の文字を別の行に分割する必要があります。私は、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

sort不一致が見つかった場合はstderr に出力しますが、戻りコードのみが必要なので stderr を削除します。

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

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

答え2

完全性のため、awkパターンとデータの通常の関係を入れ替えた ベースのソリューションを示します。

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

これにより、ファイル内の行が、 から までのソートされた文字の「参照」文字列と一致する正規表現として解釈されますaz一致した場合 (つまり、行内の文字列が の部分文字列である場合) のみ、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 ステートメントを使用できます...

関連情報