【问题标题】:How to find the longest line in a file using bash script? [duplicate]如何使用 bash 脚本查找文件中最长的行? [复制]
【发布时间】:2018-11-24 15:56:42
【问题描述】:

任何人都可以看看我的这个 bash 脚本吗?我正在尝试使用 bash 脚本查找文件中最长的行,所以我写了这个。

#!/bin/bash

#Francesco Foschi length of a row in a file

let n=0
let max_length=0

while read row
do
    length=$(echo -n $row | wc -c)
    if[ ${#length} -gt ${#max_length} ]
    then
            let max_length=${#length}
    fi

    echo "$n row is $length charachters long"
    echo "$row"
    let n=n+1

done < $1

echo "longest line is $max_length charachters long"

exit 0

每次我尝试运行控制台时都说我在意外的 then 标记附近有语法错误。我做错了什么??

顺便说一下fedora28的运行

【问题讨论】:

  • 你应该在if后面加一个空格。
  • 我建议你检查你的代码在shellcheck.net
  • length="${#row}"
  • Bash 是一个极其缓慢和俗气的工具,用于完成这项特殊任务。您想研究在 Awk 中针对任何实际场景重新实现脚本。
  • 我回滚了您的最新编辑。 Stack Overflow 上的问题应该仍然是严格的问题;将某事标记为合适答案的方法就是接受一个答案,就像你已经做过的那样。 (如果你想恢复它,question's edit history 仍然包含所有文本。)

标签: bash


【解决方案1】:

GNU wc 内置了这个功能:

-L, --max-line-length
        print the maximum display width

【讨论】:

  • 我知道这一点,但我正在尝试完整的 POSIX
【解决方案2】:

试试这个:

#!/bin/bash
#Francesco Foschi length of a row in a file

let n=0
let max_length=0

while read row
do
    length=$(echo -n $row | wc -c)
    if [ ${length} -gt ${max_length} ]
    then
            let max_length=${length}
    fi

    echo "$n row is $length charachters long"
    echo "$row"
    let n=n+1

done < $1

echo "longest line is $max_length charachters long"

exit 0

【讨论】:

    【解决方案3】:

    简单的 bash

    #!/bin/bash
    max=-1
    while IFS= read -r line; do
        [[ ${#line} -gt $max ]] && max=${#line}
    done < "$1"
    echo "longest line is $max chars long"
    

    这个成语用于准确地逐字阅读:IFS= read -r line

    演示:

    1. 创建一个带有前导/尾随空格和反斜杠的文件

      $ echo ' h\bHello ' > file
      

      此文件大小为 10 个字节(不包括尾随换行符)。

    2. 用普通的read var阅读它

      $ read line < file; printf %s "$line" | od -c
      0000000   h   b   H   e   l   l   o
      0000007
      

      只有 7 个字符:缺少反斜杠和空格

    3. 为读取添加-r 选项:

      $ read -r line < file; printf %s "$line" | od -c
      0000000   h   \   b   H   e   l   l   o
      0000010
      

      现在我们有 8 个字符(“0000010”是八进制),但仍然缺少空格。

    4. 添加IFS=变量赋值:

      $ IFS= read -r line < file; printf %s "$line" | od -c
      0000000       h   \   b   H   e   l   l   o    
      0000012
      

      10 个字符(八进制 12):现在我们有了 $line 中写入文件的确切内容。

    一直写IFS= read -r line很痛苦,但是bash给程序员带来了相当大的痛苦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 2013-11-30
      • 2021-10-20
      • 2022-11-27
      • 2023-02-08
      • 2015-01-21
      • 2014-07-17
      • 2016-05-25
      相关资源
      最近更新 更多