如何从文件中获取最长的行?


10

我有兴趣从文件中找出最长的行的行号。

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

lalala
tatatata
abracadabra
mu mu mu

我如何编写bash脚本,该脚本将为我提供如下输出:3 -> abracadabra

Answers:


9

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

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

即使您有两条或更多行具有相同的最大长度,这也将起作用。

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

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

参考文献:


3
@ don.joey:这就是Unix的力量。简单的命令,可以一起工作。在这里,他寻找“ ^。{n} $”,即,在行(^)的开始和行尾($)之间的任何一行,正好具有n个字符(.{n})。然后,他只需要找到n:为此,他使用GNU主义的“ wc -L filename”(注意这不是posix),它返回文件名最长的行的长度。因此,他会抓紧任何最长的线。$(cmd)由的输出替换cmd
Olivier Dulac

1
@OlivierDulac很棒的评论。
RaduRădeanu13年

更好的是,您还-C 3可以在grep选项中添加(例如)以获取上下文前后的几行内容
ShadSterling

8

您可以awk用来打印每行(length())和行号(NR)的长度,然后按数字()反转(-rsort结果-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

@ user214965,请参阅我的更新,显示的行号是结果中的第二个数字。
Attila O.

如果有两条最大长度相同的行怎么办?
RaduRădeanu13年

@RaduRădeanu好点。为+1 wc -L,我不知道该说法。确实非常有用。
Attila O.

4

可以使用perl一种衬垫实现AO(N):

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

用法(其中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

效率要高得多。谢谢!在寻找它。
test30 2016年

1
适用于大型文件+1
h3xStream

0

O(n)对于perl不可用的机器,例如OpenWRT,@ awk @版本可能有用。

awk 'length > l {l=length;line=$0} END {print line}' FILE

或python:

python -c "print max(open('$file', 'r'), key=len)"

0

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
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.