如何从bash中的标准输入中获取最长和最短的行

时间:2014-12-04 01:55:41

标签: linux bash

我正在编写一个脚本,以便从标准输入中获取最长和最短的行,但没有成功。

要调用程序,您应该使用以下内容:

LongShort.sh /tmp/filetest.txt

我的脚本目前看起来像这样。

#! /bin/bash LongShort.sh

longest=0
shortest=0


while read line
do
   linelength=${#line}
   if [ "$linelength" -gt "$longest" ]
   then
     $longest = $line
     $longestlength = $linelength
   elif [ "$linelength" -lt "$shortest" ]
     then
        $shortest = $line
        $shortestlength = $linelength
   fi
done < $2

echo $longestlength $longest
echo $shortestlength $shortest

有人看到了什么问题吗?

2 个答案:

答案 0 :(得分:2)

您的脚本有几个问题:

  1. 您有时使用longest来存储最长的行,有时使用它来存储最长行 length
  2. 在bash中为变量赋值时,语法为<name>=<value>,没有空格。使用左侧的$符号(通常)是错误的,因为您试图将某些内容分配给存储在变量中的值。因此$longest = $line之类的行应更改为longest=$line
  3. 通过将shortest初始化为0,您可以确保永远不会找到最短的行,因为任何行的长度都不会短于0。您需要将其初始化为至少与文件中最短行一样大的值。
  4. 编辑:正如你自己指出的那样,最好将循环内部分成两个if语句来捕获最短行是第一行的情况,或者所有行都是相同的长度。

    这是我的版本:

    #!/bin/bash LongShort.sh
    
    # use *length variables to store the lengths
    longestlength=0
    shortestlength=5000  # initialize shortestlength to something big
    
    
    while read line
    do
       linelength=${#line}
       if [ $linelength -gt $longestlength ];
       then
         longest=$line  # assign values properly
         longestlength=$linelength
       fi
       if [ $linelength -lt $shortestlength ];
       then
            shortest=$line
            shortestlength=$linelength
       fi
    done < $2
    
    echo $longestlength $longest
    echo $shortestlength $shortest
    

答案 1 :(得分:1)

printf '%s\n' a bb ccc dddd eeeee | awk '
    NR==1{long=short=$0;next}
    length($0) > length(long){long=$0}
    length($0) < length(short){short=$0}
    END{print "long=" long "|short=" short}
'

输出:

long=eeeee|short=a