计算来自多个文件的行数,并使用for循环将所有文本文件中的计数存储到一个变量中

时间:2014-08-06 12:34:53

标签: bash awk

我想计算来自许多文本文件的行数,然后将它们存储到变量中以找到最小的数字。我试图在for循环中执行此操作,但它仅存储循环中最后一个文本文件的结果。

 for txt in home/data/*.txt
 do
       count_txt=$(cat $txt | wc -l) | bc

 done

由于

4 个答案:

答案 0 :(得分:1)

试试这个单行:

wc -l /path/*.txt|awk 'NR==1{m=$1}{m=($1*1)<m?($1*1):m}END{print m}'

答案 1 :(得分:1)

shopt -s nullglob
FILES=(home/data/*.txt) LOWEST_COUNT='N/A' FILE=''
[[ ${#FILES[@]} -gt 0 ]] && read -r LOWEST_COUNT FILE < <(exec wc -l "${FILES[@]}" | sort -n)
echo "$LOWEST_COUNT | $FILE"

答案 2 :(得分:1)

你只需要这样的东西(使用GNU awk作为ENDFILE):

awk 'ENDFILE{min = (min < FNR ? min : FNR)} END{print min}' home/data/*.txt

答案 3 :(得分:0)

更新:根据EdMorton的评论, awk是用于解决此类问题的正确工具,这种方法不是最终实现,并且对某些文件名失败(如带有空格的文件名),总而言之, awk 更具高效性和可靠性

如果你想使用for循环,你可以这样做:

#!/bin/bash
MAX="0"
MIN="INIT"
for F in home/data/*.txt
do
    NBLINE=$(cat $F | wc -l)
    if [[ "$NBLINE" -gt "$MAX"  ]] ; then
            MAX="$NBLINE"
            BIG_FILE="$F"
    fi
    if [[ "$MIN" == "INIT" ]] ; then
            MIN="$NBLINE"
            SMA_FILE="$F"
    fi
    if [[ "$NBLINE" -lt "$MIN" ]] ; then
            MIN="$NBLINE"
            SMA_FILE="$F"
    fi
done
echo "File = $BIG_FILE  -- Lines = $MAX"
echo "File = $SMA_FILE  -- Lines = $MIN"
exit