Bash 多次读取文件且输出不正确
Bash reads files multiple times & output isn't right
我在读取多个文件并从这些文件中收集信息时遇到问题。这些文件的输入如下:
文件 1:
number1
text
number2
text
number3
text
文件 2:
number4
text
number5
...
我只想从每个文件中取出数字,这些数字需要放在彼此下面,但只有 1 次。
像这样:
number1
number2
number3
number4
number5
我有:
var0=$(echo "test")
var2=$(echo "test2")
for file in*.txt
do
var1=$(awk -F .. do something "$file")
done
echo "$var0" "$var1" "$var2" >> myfile
那么我想要它做什么:
test1
here print var1 (so the numbers)
test2
输入文件中有一些我想用 awk 命令输出的内容,这非常有效,当我回显 var 时,我得到 number1,number2,number3,number4,number5,number1,... 所以它保持重复命令。
当我打印所有 var 时,他只给出 var1 中最后一个文件的值:
test
number4
number5
test2
我什么都想要,还有 number1, number2,...
提前联系!
您正在循环中覆盖变量 $var1
,因此您只获得最后一个文件的内容也就不足为奇了。
如果我没理解错的话,你想要这样的东西:
awk 'BEGIN{print "test"}/^[0-9]+$/;END{print "test2"}' *.txt
这会在一个 awk 命令中读取所有 .txt
文件并打印任何仅包含数字的行(我假设这就是您编写 number1[=35= 时的意思], number2 等)
但是,如果您想继续使用您的方法,我想您唯一需要做的就是连接每个 awk 的输出,而不是覆盖 $var1
:
var1+=$(awk -F .. do something "$file")
----^
如果您实际上并不关心变量 $var1
,则无需使用串联,如评论中的 tripleee 所示:
{ echo "test"; for f in *.txt; do awk ... "$f"; done; echo "test2"; } >myfile
你也可以跳过循环(这样会更短更快):
{ echo "test"; awk ... "$f" *.txt; echo "test2"; } >myfile
...如果你能做到这一点,我们就已经回到了我的第一个建议,即使用 awk 一次性完成所有事情:)
我在读取多个文件并从这些文件中收集信息时遇到问题。这些文件的输入如下:
文件 1:
number1
text
number2
text
number3
text
文件 2:
number4
text
number5
...
我只想从每个文件中取出数字,这些数字需要放在彼此下面,但只有 1 次。
像这样:
number1
number2
number3
number4
number5
我有:
var0=$(echo "test")
var2=$(echo "test2")
for file in*.txt
do
var1=$(awk -F .. do something "$file")
done
echo "$var0" "$var1" "$var2" >> myfile
那么我想要它做什么:
test1
here print var1 (so the numbers)
test2
输入文件中有一些我想用 awk 命令输出的内容,这非常有效,当我回显 var 时,我得到 number1,number2,number3,number4,number5,number1,... 所以它保持重复命令。
当我打印所有 var 时,他只给出 var1 中最后一个文件的值:
test
number4
number5
test2
我什么都想要,还有 number1, number2,...
提前联系!
您正在循环中覆盖变量 $var1
,因此您只获得最后一个文件的内容也就不足为奇了。
如果我没理解错的话,你想要这样的东西:
awk 'BEGIN{print "test"}/^[0-9]+$/;END{print "test2"}' *.txt
这会在一个 awk 命令中读取所有 .txt
文件并打印任何仅包含数字的行(我假设这就是您编写 number1[=35= 时的意思], number2 等)
但是,如果您想继续使用您的方法,我想您唯一需要做的就是连接每个 awk 的输出,而不是覆盖 $var1
:
var1+=$(awk -F .. do something "$file")
----^
如果您实际上并不关心变量 $var1
,则无需使用串联,如评论中的 tripleee 所示:
{ echo "test"; for f in *.txt; do awk ... "$f"; done; echo "test2"; } >myfile
你也可以跳过循环(这样会更短更快):
{ echo "test"; awk ... "$f" *.txt; echo "test2"; } >myfile
...如果你能做到这一点,我们就已经回到了我的第一个建议,即使用 awk 一次性完成所有事情:)