文件中的最长行

And*_*ock 187 bash shell utilities

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

小智 254

使用wc(GNU coreutils)7.4:

wc -L filename
Run Code Online (Sandbox Code Playgroud)

得到:

101 filename
Run Code Online (Sandbox Code Playgroud)

  • 请注意,只有`-c -l -m -w`选项是POSIX.`-L`是一个GNUism. (54认同)
  • OS X:使用自制软件,使用gwc作为GNU Word Count gwc -L filename (10认同)
  • OS X:`wc:非法选项 - L用法:wc [-clmw] [file ...]` (6认同)
  • 另请注意,`-L`的结果取决于语言环境.有些字符(在字节和多字节意义上)甚至可能根本不计算! (4认同)
  • @xaxxon`gwc`在`coreutils`公式中,它使用`g`前缀安装所有GNU coreutils. (3认同)
  • 请注意,对于Windows用户,Cygwin附带的wc.exe支持-L. (2认同)

Pal*_*Dot 97

awk '{print length, $0}' Input_file |sort -nr|head -1
Run Code Online (Sandbox Code Playgroud)

供参考:查找文件中的最长行

  • @Thomas.将其表示为管道比将文件指定为选项更为通用.就我而言,我将使用数据库查询输出. (17认同)
  • 为什么额外的猫命令?只需将文件名直接作为awk的参数. (12认同)
  • @MK.然而,这种方法的行数是O(n*log(n)),而Ramon的方法是O(n). (5认同)
  • 这是最好的答案,因为它更 POSIX(嗯,适用于 OS X) (2认同)
  • 对大型文件进行排序可能需要数小时才能完成,并且要消耗千兆字节,甚至数TB的临时空间,具体取决于输入文件的大小。考虑存储最长的长度及其相关记录,然后从“ END {}”块中打印出来。 (2认同)

Ram*_*mon 66

awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 
Run Code Online (Sandbox Code Playgroud)

  • 这个答案给出了文件中最长行的*text*而不是它的长度.即使这个问题要求长度,我仍然保持原样,因为我怀疑这对于那些只是看到标题来到这个页面的人来说会很有用. (8认同)
  • `awk'length> max {max = length} END {print max}'file` (5认同)
  • ```awk'{if(length($ 0)> max)max = length($ 0)} END {print max}'YOURFILE``` (3认同)
  • 使用WC很容易计算.."awk"{if(length($ 0)> max){max = length($ 0); maxline = $ 0}} END {print maxline}'YOURFILE | wc -c` (3认同)
  • @Nick 更好的是,`... END { print length(maxline) + 1}` `wc -c` 仍然会比最长记录少一个字节,因为 awk 去掉了换行符。 (2认同)

Jen*_*ens 23

仅仅为了娱乐和教育目的,纯POSIX shell解决方案,没有无用的猫和没有分叉外部命令.将filename作为第一个参数:

#!/bin/sh

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

  • 这应该被评为更高,这是用户要求的.添加函数longest(){MAX = 0 IFS = read -r line; 如果[$ {#line} -gt $ MAX]; 然后MAX = $ {#line}; fi完成echo $ MAX}到你的.bashrc你可以运行`longest </ usr/share/dict/words` (7认同)
  • 无法从std中读取(通过cat)实际上降低了它的实用性,而不是增强它. (6认同)
  • 那么,OP明确地说"文件"而没有`<"$ 1"`它可以很容易地从stdin读取.通过测试`$ #`,它甚至可以同时执行两者,具体取决于args的数量.在这个世界上,没有必要使用无用的猫.应该从一开始就相应地教新手. (4认同)

小智 13

wc -L < filename
Run Code Online (Sandbox Code Playgroud)

101
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我一直在寻找一种方法来防止`wc` 输出文件名:) (3认同)

Chr*_*nat 11

perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1
Run Code Online (Sandbox Code Playgroud)

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

perl -ne 'print length()."  line $.  $_"' myfile | sort -n
Run Code Online (Sandbox Code Playgroud)

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

.是串联运算符 - 它在length()之后用于
$.当前行号
$_是当前行


wan*_*ngf 7

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

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 你可以更进一步,消除 cat。`awk '{打印长度}' test.txt | 排序-rn | 头-1`。如果您还需要实际行的内容,则 `awk '{print length,$0}' test.txt | 排序-k1-rn| 头-1` (2认同)

Joh*_*ney 6

在上述示例中,重要的一点被忽略了。

以下2个示例计算扩展标签

  wc -L  <"${SourceFile}" 
# or
  expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Run Code Online (Sandbox Code Playgroud)

以下2个计数未展开的标签。

  expand --tabs=1 "${SourceFile}" | wc -L 
# or
  awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
Run Code Online (Sandbox Code Playgroud)

所以

              Expanded    nonexpanded
$'nn\tnn'       10            5
Run Code Online (Sandbox Code Playgroud)