假设我有一个如下的文本文件
abcd
aaaaaaa
gfgk
hahahahahahhahh
gf
然后gf
就会返回。有什么好的想法吗?
答案1
假设您的每行都包含一个字符的“单词”,
并且我们不介意让 shell 做更多的工作,
这里有一个 AWK 解决方案。
# 让你的文本在 `str.txt` 中 awk'{打印长度($1),$1}'str.txt|sort-nk1|head-1 # 输出:2 gf ## 哪个是最短的字符串
您可以优化它以避免使用更多 AWK 进行排序。
如果每行有多个“单词”,您可以进一步调整它。
还要注意,如果你有多个最短字符串,这将返回其中一个。
你也可以使用其他技巧来获取它们。
答案2
Awk 非常适合这个:
awk '(NR == 1 || length < length(shortest)) { shortest = $0 } END { print shortest }'
如果当前行是第一行或者其长度比之前见过的最短行短,则第一部分将“最短”变量设置为当前行。最后,最后一部分打印出最短的值。
答案3
BASH 常见问题解答条目 #1告诉如何逐行读取文件。${#foo}
将给出的长度$foo
。只需循环,依次测试每一行。
答案4
以下是我使用 Perl 提供的相当笨拙的代码:
grep . file | perl -E '@a=<>; @s = sort {length $a <=> length $b}@a; say $s[0] . "Line $."; '
稍微简单一点: perl -ne '$l = $_ if $. == 1; $l = $_ if length($) < 长度($l); END {print $l;}' 文件 ### 最短 perl -ne '$l = $如果 $. == 1; $l = $_ 如果 length($_) > length($l); END {print $l;}' 文件 ### 最长
grep . file | perl -ne '$l = $_ if $. == 1; $l = $_ if length($_) < length($l); END {print $l;}' ## 最短删除可能的空白行
grep . file | perl -ne '$l = $_ if $. == 1; $l = $_ if length($_) < length($l); END {print $l;}' ## 最长删除可能的空白行