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

时间:2018-11-24 15:56:43

标签: 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 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的BTW运行

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

GNU wc内置了以下功能:

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

答案 2 :(得分:1)

普通打击

#!/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给程序员带来了很大的痛苦。