【问题标题】:Longest line in a file文件中最长的行
【发布时间】:2010-12-11 22:33:25
【问题描述】:

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

【问题讨论】:

    标签: bash shell utilities


    【解决方案1】:

    使用 wc (GNU coreutils) 7.4:

    wc -L filename
    

    给予:

    101 filename
    

    【讨论】:

    • 请注意,只有 -c -l -m -w 选项是 POSIX。 -L 是 GNU 主义。
    • 还要注意-L 的结果取决于语言环境。有些字符(无论是字节还是多字节)甚至可能根本不计算在内!
    • OS X:wc: illegal option -- L usage: wc [-clmw] [file ...]
    • OS X:使用自制软件,将 gwc 用于 GNU 字数统计 gwc -L 文件名
    • @xaxxon gwccoreutils 公式中,它会安装所有带有g 前缀的GNU coreutils。
    【解决方案2】:
    awk '{print length, $0}' Input_file |sort -nr|head -1
    

    供参考:Finding the longest line in a file

    【讨论】:

    • 为什么要使用额外的 cat 命令?只需将文件名直接作为 awk 的参数即可。
    • @Thomas。将其表示为管道比将文件指定为选项更通用。在我的例子中,我将使用来自数据库查询的输出。
    • 这是最好的答案,因为它更符合 POSIX(好吧,适用于 OS X)
    • @MK。但是,这种方法在行数上是 O(n*log(n)),而 Ramon 的方法是 O(n)。
    • 对大文件进行排序可能需要数小时才能完成并消耗 GB 甚至 TB 的临时空间,具体取决于输入文件的大小。考虑存储最长的长度及其相关记录,然后从END{} 块中打印出来。
    【解决方案3】:
    awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 
    

    【讨论】:

    • awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
    • awk 'length>max{max=length}END{print max}' file
    • 这个答案给出了文件中最长行的 text 而不是它的长度。即使问题询问长度,我仍将其保留原样,因为我怀疑它对于仅查看标题就来到此页面的人会很有用。
    • 使用 WC 很容易获得计数。awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
    • @Nick 更好的是,... END { print length(maxline) + 1} wc -c 仍然会比最长记录少一个字节,因为 awk 会去掉换行符。
    【解决方案4】:

    仅出于娱乐和教育目的,纯 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"
    

    【讨论】:

    • 无法从 std in 读取(通过 cat)实际上降低了它的实用性,而不是增强了它。
    • 好吧,OP 明确表示“文件”并且没有&lt; "$1" 它可以轻松地从标准输入读取。通过对$# 的测试,它甚至可以同时进行这两种操作,具体取决于参数的数量。这个世界上根本不需要没用的猫。应该从一开始就对新手进行相应的教育。
    • 这应该被评为更高,这是用户要求的。添加函数longest() { MAX=0 IFS= while read -r line;如果 [ ${#line} -gt $MAX ];然后 MAX=${#line}; fi done echo $MAX } 到你的 .bashrc 你可以运行longest &lt; /usr/share/dict/words
    【解决方案5】:
    wc -L < filename
    

    给予

    101
    

    【讨论】:

    • 谢谢,我一直在寻找一种方法来阻止wc 输出文件名:)
    【解决方案6】:
    perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1
    

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

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

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

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

    【讨论】:

    • 需要对文件进行排序。即使对于中等大小的文件,性能也会很糟糕,并且不适用于较大的文件。 wc -L 是我目前看到的最好的解决方案。
    • 使用 550MB 6,000,000 行文本文件作为源(英国国家语料库),perl 解决方案耗时 12 秒,而wc -L 耗时 3 秒
    • wc -L 只计算数字记录 - 这个 Q 即将找到 longest 行 - 不太一样,所以这不是准确的比较。
    【解决方案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
    

    【讨论】:

    • 好了。这发现了我令人讨厌的长cmets。谢谢老兄。
    • 您可以更进一步,消除猫。 awk '{print length}' test.txt | sort -rn | head -1。如果你也需要实际行的内容,那么awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
    【解决方案8】:

    以上示例中被忽略的重要一点。

    以下 2 个示例计算扩展选项卡

      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}"
    

    所以

                  Expanded    nonexpanded
    $'nn\tnn'       10            5
    

    【讨论】:

      【解决方案9】:

      在 perl 中:

      perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1
      

      这只会打印行,而不是长度。

      【讨论】:

        【解决方案10】:

        这里是anwser的参考

        cat filename | awk '{print length, $0}'|sort -nr|head -1
        

        http://wtanaka.com/node/7719

        【讨论】:

        • 第二个 awk 脚本只会告诉你最长的长度,不会显示最长的行。
        • 来吧..这些与参考文献中添加的前两个答案相同。
        • @rsp: 我杀了第二个回答者
        【解决方案11】:

        我在 Unix 环境中,使用大小为几 GB 的 gzip 压缩文件。我使用记录长度为 2052 的 2 GB gzip 压缩文件测试了以下命令。

        1. zcat &lt;gzipped file&gt; | wc -L

        1. zcat &lt;gzipped file&gt; | awk '{print length}' | sort -u

        时间是平均的

        1. 117 秒

        2. 109 秒

        这是我运行了大约 10 次后的脚本。

        START=$(date +%s) ## time of start
        
        zcat $1 |  wc -L
        
        END=$(date +%s) ## time of end
        DIFF=$(( $END - $START ))
        echo "It took $DIFF seconds"
        
        START=$(date +%s) ## time of start
        
        zcat $1 |  awk '{print length}' | sort -u
        
        END=$(date +%s) ## time of end
        DIFF=$(( $END - $START ))
        echo "It took $DIFF seconds"
        

        【讨论】:

        • 我不确定这是一个有效的比较,我担心awk 版本会受益于首先运行的wc 版本的磁盘块缓存(并为磁盘缓存提供种子) .您必须随机化在十次运行中谁首先被调用的顺序,以使这个论点成立。
        【解决方案12】:

        只是为了好玩,这里是 Powershell 版本:

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

        并且只是得到长度:

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

        【讨论】:

        • 所以连powershell程序员都得用没用的猫?
        • @Jens 不确定我是否理解你,Powershell 中的 cat 只是 Get-Content 的别名,其行为取决于上下文和提供者。
        • sort 可以将 filename.txt 作为参数吗?那么猫就没有用了,因为sort length filename.txt | select -last 1 避免了一个管道和一个只复制数据的进程。
        • 作为旁注,powershell 到底是什么?我以为 powershell 实用程序是用于 windows 机器的?
        • @Jens,数据经常来自流而不是文件名。这是一个标准的 unix 工具习语。
        【解决方案13】:

        主题的变化。

        这将显示 所有 行,其长度与文件中找到的最长行相同,并保持它们在源中出现的顺序。

        FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
        

        所以我的文件

        x
        mn
        xyz
        123
        abc
        

        会给

        xyz
        123
        abc
        

        【讨论】:

          【解决方案14】:

          如果您使用的是 MacOS 并收到此错误: wc: illegal option -- L 你不需要安装 GNU siply 这样做。

          如果您只想获取文件最长行中的字符数并且您正在使用 OS X 运行:

          awk '{print length}' "$file_name" | sort -rn | head -1

          类似的东西;

          echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"

          输出:

          The longest line in the file my_file has 117 characters

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-29
            • 2012-09-07
            • 2021-09-15
            • 1970-01-01
            • 2011-12-04
            • 1970-01-01
            • 2012-10-23
            • 1970-01-01
            相关资源
            最近更新 更多