如何循环遍历文件的行数

如何循环遍历文件的行数

我想循环遍历文本文件的行a.txt。我知道如果文件有 6 行,我可以这样做:

for c in {1..6} ; do echo $c; done

打印:

1
2
3
4
5
6

我可以将行数计算为

wc -l a.txt | cut -f1 -d' '

这使2852

现在,当尝试将wc计数替换为 for 循环时,如下所示,循环不起作用:

for c in {1..$(wc -l ~/a.txt| cut -f1 -d' ')} ; do echo $c; done

它不打印 1 到 2852 之间的数字,而是打印:

{1..2852}

如何修复上述循环中的子 shell 用法以获得正确的数字序列?

( bash --version是 (Debian):

GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.

答案1

巴什没有将变量放在括号中的功能,例如

var=$(wc -l ~/a.txt| cut -f1 -d' ')}
echo {0..$var}

您可以使用循环:

for ((i=0; i<var; i++)); do
    echo "$i"
done

即使它有效,也应该避免这种情况:

eval echo {0..$var}

eval是“邪恶”的常见拼写错误。
http://mywiki.wooledge.org/BashFAQ/048

答案2

您实际上不需要知道文件中的行数来处理它,只需处理它,甚至不使用 shell 循环;和awk

awk '{ print "do something on line#", NR, $0 }' infile

awk,内部变量NR将返回数量ecord(/Line)$0是当前读取进行处理的该行的内容。

相关内容