【问题标题】:Bash reads files multiple times & output isn't rightBash 多次读取文件 & 输出不正确
【发布时间】:2015-07-02 18:50:45
【问题描述】:

我在读取多个文件并从这些文件中收集信息时遇到问题。这些文件的输入如下:

文件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,...

提前打好!

【问题讨论】:

  • 我不明白你所有的代码流,但你清楚地把echo ... >> myfile放在for循环之后。
  • 很简单,我用 awk 命令得到了一些数字,并且来自不同的文件。我想打印所有这些文件的输出 1 次,总是在下一行(发生在 awk 命令中,在数字之前我想要一些类似于测试的文本。但是回显只给出最后一个文本文件的输出而不是全部

标签: bash file variables for-loop echo


【解决方案1】:

您在循环中覆盖了您的变量$var1,因此您只获得最后一个文件的内容也就不足为奇了。

如果我理解正确,你想要这样的东西:

awk 'BEGIN{print "test"}/^[0-9]+$/;END{print "test2"}' *.txt

这会在一个 awk 命令中读取所有 .txt 文件并打印任何仅包含数字的行(我假设这就是您在编写 number1number2 等等)

但是,如果您想继续使用您的方法,我想您唯一需要做的就是连接每个 awk 的输出,而不是覆盖 $var1

var1+=$(awk -F .. do something "$file")
----^

如果您实际上并不关心变量 $var1,则无需使用连接,如 cmets 中的 tripleee 所示:

{ echo "test"; for f in *.txt; do awk ... "$f"; done; echo "test2"; } >myfile

你也可以跳过循环(这样会更短更快):

{ echo "test"; awk ... "$f" *.txt; echo "test2"; } >myfile

...如果你能做到这一点,我们已经回到了我的第一个建议,即使用 awk 一次性完成所有事情:)

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2019-06-16
    • 2015-10-08
    • 1970-01-01
    • 2023-04-08
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多