如何使用bash脚本查找文件中最长的行?

如何使用bash脚本查找文件中最长的行?,bash,Bash,有人能看一下我的这个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 ma

有人能看一下我的这个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试试以下方法:

#!/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
GNU wc内置了以下功能:

-L, --max-line-length
        print the maximum display width
普通重击

#!/bin/bash
max=-1
while IFS= read -r line; do
    [[ ${#line} -gt $max ]] && max=${#line}
done < "$1"
echo "longest line is $max chars long"
此文件的大小为10字节,不包括尾随换行符

用普通读取变量读取它

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

添加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行是一件痛苦的事情,但是bash给程序员带来了相当大的痛苦。

您应该在if这个词后面加一个空格。我建议您检查代码的长度=${row}bash对于这个特定任务来说是一个极其缓慢和俗气的工具。您想研究在Awk中为任何真实场景重新实现脚本。我回滚了您的最新编辑。关于堆栈溢出的问题应严格保留为问题;将某件事标记为合适答案的方法就是简单地接受一个答案,就像你已经接受的那样。如果你想恢复它,它仍然包含所有的文本。我知道这一点,但我正在尝试完整的POSIX
$ read line < file; printf %s "$line" | od -c
0000000   h   b   H   e   l   l   o
0000007
$ read -r line < file; printf %s "$line" | od -c
0000000   h   \   b   H   e   l   l   o
0000010
$ IFS= read -r line < file; printf %s "$line" | od -c
0000000       h   \   b   H   e   l   l   o    
0000012