我想找到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 语句来验证最后一个字符是否小于下一个...