文件中最长的一行

249
我正在寻找一种简单的方法来查找文件中最长行的长度。理想情况下,它应该是一个简单的Bash shell命令,而不是一个脚本。

相关链接:https://unix.stackexchange.com/questions/24509/how-to-print-the-longest-line-in-a-file - undefined
14个回答

323

使用 wc (GNU coreutils) 7.4 版本:

wc -L filename

提供:

101 filename

61
请注意,仅 -c -l -m -w 选项符合 POSIX 标准。-L 是 GNU 特有的。 - Jens
5
请注意,-L 的结果取决于语言环境。有些字符(无论是字节还是多字节)甚至可能根本不被计算在内! - Walter Tross
12
OS X: wc: illegal option -- L usage: wc [-clmw] [file ...]OS X系统中,运行wc命令时出现错误提示:wc: illegal option -- L usage: wc [-clmw] [file ...] - Hugo
15
在 macOS 上,使用 Homebrew 安装 gwc 工具进行 GNU 字数统计。使用命令 "gwc -L 文件名" 进行统计。 - kaycoder
4
gwccoreutils 公式中的一部分,安装所有带有 g 前缀的 GNU 核心工具。 - gsnedders
显示剩余4条评论

137

13
为什么要多余的cat命令?直接将文件名作为awk的参数传递即可。 - Thomas Padron-McCarthy
21
将其表示为管道比指定文件作为选项更为通用。在我的情况下,我将使用从数据库查询输出的管道输出。 - Andrew Prock
2
这个答案是最好的,因为它更符合POSIX标准(在OS X上也能工作)。 - MK.
5
然而,这种方法的时间复杂度是O(n*log(n)),其中n是行数,而Ramon的方法的时间复杂度为O(n)。 - jub0bs
3
对于一个大文件的排序可能需要数个小时,并且会消耗几个GB或TB的临时空间,具体取决于输入文件的大小。考虑存储最长的长度及其相关记录,然后从END{}块中打印出来。 - Luv2code

77
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 

3
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE - ke20
7
awk 'length>max{max=length}END{print max}' file - Chris Seymour
10
这个答案给出了文件中最长一行的文本,而不是它的长度。尽管问题要求的是长度,但我还是保留原样,因为我认为对于只看标题进入此页面的人来说,这可能会有用。 - Ramon
3
使用WC很容易得到计数。awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c - Nick
2
@Nick 更好的方法是 ... END { print length(maxline) + 1} 因为 awk 会去掉换行符,所以 wc -c 命令得到的字符数会比最长记录少一个字节。 - Luv2code
显示剩余3条评论

25

为了娱乐和教育目的,以下是纯粹的POSIX shell解决方案,没有无用的cat使用和不需要调用外部命令。将文件名作为第一个参数:

#!/bin/sh

MAX=0 IFS=
while read -r line; do
  if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"

6
无法从标准输入中读取(通过cat)实际上减少了这个程序的效用,而不是增加它。 - Andrew Prock
4
好的,OP明确指出了“file”,没有 < "$1" 的话它可以很容易地从标准输入读取。通过对 $# 进行测试,它甚至可以根据参数数量同时实现两者。在这个世界上没有无用的 cat 命令。新手应该从一开始就学会正确的方法。 - Jens
7
这应该得到更高的评价,因为这就是用户要求的。将以下代码添加到您的 .bashrc 文件中,然后您就可以运行 longest < /usr/share/dict/wordsfunction longest () { MAX=0 IFS= while read -r line; do if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi done echo $MAX } - skierpage

14
wc -L < filename

提供

101

3
谢谢,我一直在寻找一种方法来防止 wc 输出文件名 :) - Peter.O

12
perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1

打印最长行的长度、行号和内容

perl -ne 'print length()."  line $.  $_"' myfile | sort -n

打印按行排序的列表,包括行号和长度

.是连接运算符 - 此处在length()后使用
$.是当前行号
$_是当前行


需要对文件进行排序...即使是中等大小的文件,性能也会非常糟糕,并且对于更大的文件也无法工作。wc -L是我目前看到的最佳解决方案。 - Tagar
使用一个550MB、600万行的文本文件作为源文件(英国国家语料库),Perl解决方案花费了12秒钟,而wc -L只花费了3秒钟。 - Chris Koknat
wc -L 只是计算记录数,而这个问题是关于查找最长行的,两者并不完全相同,因此这不是准确的比较。 - Tagar

9

看起来所有的答案都没有给出最长行的行号。以下命令可以给出行号和大致长度:

$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11

好的,这样就可以找到我那些令人讨厌的长评论了。谢谢啊。 - Philip
2
你可以更进一步,消除cat。awk '{print length}' test.txt | sort -rn | head -1. 如果你也需要实际行的内容,则为 awk '{print length,$0}' test.txt | sort -k1 -rn| head -1 - kakoma

6
在上面的示例中,有一个重要的被忽视的问题。
以下两个示例计算扩展的制表符。
  wc -L  <"${SourceFile}" 
# or
  expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'

以下代码计算出包括2个非扩展制表符的数量。
  expand --tabs=1 "${SourceFile}" | wc -L 
# or
  awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"

so

              Expanded    nonexpanded
$'nn\tnn'       10            5

3

仅供娱乐,这是 Powershell 版本:

cat filename.txt | sort length | select -last 1

如果只需要获取长度:

(cat filename.txt | sort length | select -last 1).Length

4
那么,即使是PowerShell程序员也必须使用无用的cat命令吗? - Jens
1
@Jens 不太确定我理解你的意思,Powershell 中的 cat 只是 Get-Content 的别名,其行为取决于上下文和提供程序。 - Eddie Groves
sort 命令可以将 filename.txt 作为参数吗?如果可以的话,那么 cat 命令就没用了,因为 sort length filename.txt | select -last 1 可以避免使用管道和复制数据的过程。 - Jens
顺便问一下,什么是PowerShell?我以为PowerShell实用程序是用于Windows机器的? - franklin
4
@Jens,数据通常来自于流而不是文件名。这是Unix工具的标准用法。 - Andrew Prock

3

1
那个第二个 awk 脚本只会告诉你最长的长度,而不会显示最长的行。 - rsp
1
加油!这些与前两个答案相同,只是添加了参考资料。 - Ravindra S
@rsp:我删除了第二个答案。 - Nadir SOUALEM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接