【问题标题】:How do you name output files using an increment after a bash file loop?如何在 bash 文件循环后使用增量命名输出文件?
【发布时间】:2014-06-26 06:56:47
【问题描述】:

我正在尝试使用 awk 命令处理一堆文件(五个),并使用增量命名输出文件。 输入文件具有复杂的名称。我知道如何重用文件的基本名称来重命名输出,但我想简化文件名。

这是我的代码:

for f in *.txt; do
    for i in {1..5}; do
        echo processing file $f
        awk '
            { if ($1=="something" && ($5=="60" || $5=="61"|| $5=="62"|| $5=="63"|| $5=="64"|| $5=="65"|| $5=="66"|| $5=="67"|| $5=="68"|| $5=="69"|| $5=="70"))
            print   }' $b.txt>"file_treated"$i.txt
        echo processing file $f over
    done
done

我知道错误在第二行,因为我写的内容为第一个值的每个值运行第二个循环。我希望第一个循环的每个值对应于第二个循环的一个值。

希望这已经足够清楚了

【问题讨论】:

    标签: bash loops for-loop awk


    【解决方案1】:

    使用计数器:

    i=1
    for f in *.txt
    do
        echo "$f is number $((i++))"
    done
    

    【讨论】:

    • 您的代码中是否缺少某些内容?像最后的 i++ 吗?我不得不承认我仍然不明白这一点。每次计数器值增加时,使用计数器不会覆盖所有文件吗?
    • 为什么增加一个数字会覆盖所有文件?
    • 因为对于 i 的每个值,您都在运行完整的 for 循环
    • @user22277 循环每个文本文件只运行一次迭代。
    • @user22277 $((i++)) 在 echo 打印之后增加 $i。试试i=0; echo $((i++)) $i,它会返回0 1
    【解决方案2】:

    怎么样:

    i=0
    for f in *.txt; do
        let i++;
        awk '$1=="something" && ($5 >= 60 && $5 <=70)' "$f" > file_treated"${i}".txt
    done
    

    我简化了您的 awk 命令并理顺了您的各种引用问题。我还删除了$b.txt,因为您只是在重新创建$f。我留下了 echo $b 等,以防你真的想要它,但它可以很容易地替换为 echo "$f"

    【讨论】:

    • 是的,很抱歉,$b 的东西是以前版本的代码遗留下来的。你能告诉我更多关于引用问题的信息,例如为什么我的引用不正确吗?
    • @user22277 因为他们不在 :)。您应该始终引用 shell 变量,在不同的上下文中出于不同的原因,但这是一个好习惯。它 i) 保护变量中的特殊字符不被 shell 解释,ii) 防止分词,这通常也是一个问题。在这里,如果您的文件名包含空格,那么您的大多数命令都会中断,除非您引用了该变量。我删除了所有b 的东西,因为你说你不需要。查看更新的答案。
    • 始终引用变量的好建议。考虑到这一点:... &gt; "file_treated${i}.txt"。另外,wrt $5 &gt;= 60 &amp;&amp; $5 &lt;="70",我认为您不需要在一个数字而不是另一个数字周围加上引号。
    • @EdMorton 好吧,由我自己的宠物吊起来。在我的辩护中,我从 OP 的原始帖子中复制了两者:)。谢谢,已修复。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 2016-09-10
    • 1970-01-01
    • 2019-07-05
    • 2022-11-18
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多