英文:
Counting number of lines in file and saving it in a bash file
问题
for FILE in *.txt; do
if [ $(wc -l < "$FILE") -eq 10 ]; then
echo "$FILE" >> saved_names.txt
fi
done
英文:
I am trying to loop through all the files in a folder and add the file name of those files with 10 lines to a txt file but I don't know how to write the if statement.
As of right now, what I have is:
for FILE in *.txt do if wc $FILE == 10; then "$FILE" >> saved_names.txt fi done
I am getting stuck in how to format the statement that will evaluate to a boolean for the if statement.
I have already tried the if statement as:
if [ wc $FILE != 10 ]
if "wc $FILE" != 10
if "wc $FILE != 10"
as well as other ways but I don't seem to get it right. I know I am new to Bash but I can't seem to find a solution to this question.
答案1
得分: 2
你的代码存在一些问题。以下是翻译好的部分:
-
要统计文件中的行数,你应该运行"wc -l"命令。然而,该命令会返回行数和文件的名称(例如 - 10 a.txt - 你可以在终端上运行该命令来测试)。要仅获得行数,你需要将文件的名称传递给该命令的标准输入。
-
在Bash中使用"=="来比较字符串。要比较整数,你应该使用"-eq"(参考这里 https://tldp.org/LDP/abs/html/comparison-ops.html)。
-
关于括号:要获取"wc"命令的结果,你需要在终端中运行它,并将命令切换到代码中的结果。为此,你需要正确的括号 - $(wc -l)。要将比较的结果作为布尔值接收,你需要使用带有空格的方括号 [ 1 -eq 1 ]。
-
要使用">>"将文件名保存到另一个文件中,你需要首先将文件名放到标准输出(因为">>"会将标准输出重定向到所选位置)。你可以使用echo命令来实现这一点。
代码应该如下所示:
#!/bin/bash
for FILE in *.txt
do
if [ "$(wc -l < "$FILE")" -eq 10 ]
then
echo "$FILE" >> saved_names.txt
fi
done
英文:
There are a few problems in your code.
- To count the number of lines in the file you should run "wc -l" command. However, that command will result in the number of lines and the name of the file (so for example - 10 a.txt - you can test it by running the command on a file in your terminal). To receive only the number of lines you need to pass the file's name to the standard input of that command
- "==" is used in bash to compare strings. To compare integers as in that case, you should use "-eq" (take a look here https://tldp.org/LDP/abs/html/comparison-ops.html)
- In terms of brackets: To get the wc command result you need to run it in a terminal and switch the command in the code to the result. To do that, you need correct brackets - $(wc -l). To receive a result of the comparison as a bool, you need to use square brackets with spaces [ 1 -eq 1 ].
- To save the name of the file in another file using >> you need to first put the name to the standard output (as >> redirect the standard output to the chosen place). To do that you can just use the echo command.
The code should look like this:
#!/bin/bash
for FILE in *.txt
do
if [ "$(wc -l < "$FILE")" -eq 10 ]
then
echo "$FILE" >> saved_names.txt
fi
done
答案2
得分: 1
尝试:
for file in *.txt; do
if [[ $(wc -l < "$file") -eq 10 ]]; then
printf '%s\n' "$file"
fi
done >> saved_names.txt
如果要追加文件名,请将 >>
替换为 >
。
相关文档:
英文:
Try:
for file in *.txt; do
if [[ $(wc -l < "$file") -eq 10 ]]; then
printf '%s\n' "$file"
fi
done > saved_names.txt
Change >
to >>
if you want to append the filenames.
Related docs:
答案3
得分: 0
从文件中提取实际行数使用 wc -l $FILE | cut -f1 -d' '
,并使用 -eq
运算符:
for FILE in *.txt; do if [ "$(wc -l $FILE | cut -f1 -d' ')" -eq 10 ]; then "$FILE" >> saved_names.txt; fi; done
英文:
Extract the actual number of lines from a file with wc -l $FILE | cut -f1 -d' '
and use -eq
operator:
for FILE in *.txt; do if [ "$(wc -l $FILE | cut -f1 -d' ')" -eq 10 ]; then "$FILE" >> saved_names.txt; fi; done
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论