
我想找到txt檔案中按字母順序排列的所有序列,而不進行排序。
範例:假設文字檔如下所示:
aedftg
wqof
abcdef
oufn
pqrs
aabcd
輸出應該是
abcdef
pqrs
也沒有重複字符,如aabcd
.
答案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
檢查特定於區域設定的排序規則是更好的方法,這樣您就不必對字母表進行硬編碼。作為麥克瓊斯做到了,這意味著您必須將該行的字元拆分為單獨的行。我使用 shell 腳本(使用支援子字串擴展的現代 shell)來完成此操作,以避免呼叫 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。
非英文輸入的示範($
字元是 shell 提示字元):
$ 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...如果您不想使用排序命令,您可以將每個字元轉換為 int 並使用 if 語句來驗證最後一個字元是否小於下一個...