如何用shell获取文本文件中最短的字符串

如何用shell获取文本文件中最短的字符串

假设我有一个如下的文本文件

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;}' ## 最长删除可能的空白行

相关内容