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


0

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

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

(它实际上是几千长,但我是Linux的新手,想要让它变得简单。)

我想,只在shell中,按每行的长度,任一方向对列表进行排序。最小的第一个或最后一个。

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


1
“只在shell中”是否意味着您要避免 sort 还有?
choroba

1
你为什么要避免 awk?这是家庭作业吗?
DavidPostill

Answers:


3

命令

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.