如何解决如果文件中的行多于2,则if-then循环用于子目录
一个目录包含30个子目录(均以_g结尾)。在每个子目录中,都有一个名为report.txt
的文件。如果文件report.txt
中的行大于2,则需要循环访问所有子目录并执行语句1;如果小于2,则需要执行语句2。
我尝试使用此脚本,但没有得到确切的输出。
#!/bin/bash
File=report.txt
for g in *_g;
if ((awk 'END{print NR}' $g/"$File" > 2)); then
echo "$g:";
Statement 1 "$g"/report.txt
echo "------------------";
else
echo "$g:";
Statement 2 "$g"/report.txt
echo "------------------";
fi
done
解决方法
您可以像这样测试行号:
#!/bin/bash
filename="report.txt"
for f in *_g/"$filename"; do
if [ $(wc -l < "$f") -gt 2 ]; then
echo "inside statement 1 for directory ${f%/*}"
# do stuff
else
echo "inside statement 2 for directory ${f%/*}"
# do stuff
fi
done
对于大型输入文件,出于性能原因,我们希望在不计入文件末尾的情况下测试行号,因此这里有一些替代方法:
-
使用bash-builtin
mapfile
,我们仅读取3行。 (作者LéaGris)mapfile -n3 <"$f"; if [ ${#MAPFILE[@]} -gt 2 ]; then
-
使用
sed
(@ Tomi Ollila撰写)if sed -n 3q1 "$f"; then
如果文件有0,1或2行,则此sed
以状态0退出,否则,在第3行以status 1
退出。
-
或者在阅读第三行后使用
head
退出。if [ $(head -3 "$f" | wc -l) -gt 2 ]; then
我要替换原来使用find
的答案。该答案无法正确处理目录或文件名中的空格。
此示例还创建了一些目录和文件进行测试。
#!/bin/bash
mkdir -p 01_g 02_g "0 03_g"
touch 01_g/report.txt
cat <<EOF > 02_g/report.txt
one line
EOF
cat <<EOF > "0 03_g/report.txt"
one line
two line
EOF
for FILE in *_g/report.txt
do
LINE_COUNT=$(wc -l "$FILE" | cut -d' ' -f1)
if [ "$LINE_COUNT" == 0 ]
then
echo "$FILE: The file is empty."
fi
if [ "$LINE_COUNT" == 1 ]
then
echo "$FILE: The file has one line."
fi
if [ "$LINE_COUNT" == 2 ]
then
echo "$FILE: The file has two lines."
fi
done
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。