如何获取文件中的最长行及其行号?

如何获取文件中的最长行及其行号?

我感兴趣的是找出文件中最长行的行号。

例如,如果我有一个包含以下内容的文件:

lalala
tatatata
abracadabra
mu mu mu

我怎样才能编写一个 bash 脚本来给出如下输出:3 -> abracadabra

答案1

您可以使用awk打印每行的长度 ( length()) 和行号 ( NR),然后按数字 ( ) 反转 ( -r)sort结果-n

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala

仅显示第一行:

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr

答案2

您不需要脚本来执行此操作。一个简单的命令就足够了:

egrep -n "^.{$(wc -L < filename)}$" filename

即使有两条或多条具有相同最大长度的线,这也能起作用。

如果您希望输出完全符合以下形式:3 -> abracadabra,则使用:

egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'

参考:

答案3

AO(N) 可以用 perl 单行代码实现:

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

usages(其中 machin 是文件名)

cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

或者

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin

或(不太清楚但较短)

perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin

答案4

Radu 的答案完全足够并且是首选,但如果您想要更明确的基于 shell 的解决方案,那么您可以使用以下脚本:

#!/bin/bash
longest_length=0
longest_string=0
while IFS= read -r line || [ -n "${line}"]
do
    if [ "${#line}" -gt "${longest_length}" ]
    then
        longest_length="${#line}"
        longest_string="$line"
    fi
done < "$1"

echo "${longest_string}"

用法:./find_longest.sh input.txt

例子:

$ cat input.txt                                                          
1 2 
2 3 a a a a
4 5 6 
1 1 1 5

$ ./find_longest.sh input.txt                                            
2 3 a a a a

相关内容