我想计算来自许多文本文件的行数,然后将它们存储到变量中以找到最小的数字。我试图在for循环中执行此操作,但它仅存储循环中最后一个文本文件的结果。
for txt in home/data/*.txt
do
count_txt=$(cat $txt | wc -l) | bc
done
由于
答案 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