Linux Shell - 按每行的长度对文本文件进行排序,然后打印最短的行

Linux Shell - 按每行的长度对文本文件进行排序,然后打印最短的行

我有一个文件,file.txt其中包含以下内容:

This is many letters
This is few
Hi
This is a very long sentence.

(它实际上有几千行长,但我是 Linux 新手,想让它变得简单一些。)

我只想在 shell 中按每行的长度对列表进行排序,无论哪个方向。最小的排在最前面或最后。

然后我希望它打印最短的一行“hi”,并可能告诉我它在哪一行以及字符数。我该怎么做,最好不使用 Awk?

答案1

命令

line_num=0
while IFS= read -r line
do
    echo "${#line} $((++line_num)) $line"
done < file.txt > tmpfile.txt

将创建一个名为的文件tmpfile.txt,其内容如下:

20 1 This is many letters
11 2 This is few
2 3 Hi
29 4 This is a very long sentence.

其中每行前面都有其长度和行号。然后sort -n tmpfile.txt会产生:

2 3 Hi
11 2 This is few
20 1 This is many letters
29 4 This is a very long sentence.

按行长排序。然后您可以将其发送到head -n1以获取第一行(即最短的行)或tail -n1获取最后一行(即最长的行)。或者使用sort -nr来反转顺序,这样您就可以使用head -n1来获取最长的行。(这可能比使用 更有效tail。)

如果您只想查看最短的行,则可以使用管道并避免创建临时文件:

line_num=0
while IFS= read -r line
do
    echo "${#line} $((++line_num)) $line"
done < file.txt | sort -n | head -n1

这可能更有效率awk

相关内容