【问题标题】:How Can I Loop Edit Multiple Files in Bash script?如何在 Bash 脚本中循环编辑多个文件?
【发布时间】:2021-02-27 23:40:30
【问题描述】:

我有 40 个 csv 文件需要编辑。 20 个具有匹配格式,名称仅相差一个字符,例如 docA.csv、docB.csv 等。另外 20 个也匹配并命名为 pair_docA.csv、pair_docB.csv 等。

我编写了用于编辑和组合 docA.csv 和 pair_docA.csv 的代码,但我正在努力编写一个循环来调用上述两个文件,编辑它们,并将它们组合在名称 combineA.csv 下,然后继续在下一对。

谁能帮助我编写基本的 bash 脚本?这是我到目前为止所拥有的。我已经尝试过一个 for 循环,现在我正在尝试 2 个(可能是 3 个)for 循环。我宁愿把它放在一个循环中。

set -x
DIR=/path/to/file/location

for file in `ls $DIR/doc?.csv`
do

#code to edit the doc*.csv files ie $file

done

for pairdoc in `ls $DIR/pair_doc?.csv`
do

#code to edit the piar_doc*.csv files ie $pairdoc

done

#still need to combine the files. I have the join written for a single iteration, 
#but how do I loop the code to save each join as a different file corresponding
#to combined*.csv

【问题讨论】:

标签: bash for-loop sed


【解决方案1】:

类似的东西:

#!/bin/bash

dir=/path/to/file/location
 
cd "$dir" || exit
for file in doc?.csv; do
    pair=pair_$file
    # "${file#doc}" deletes the prefix "doc"
    combined=combined_${file#doc}
    cat "$file" "$pair" >> "$combined" 
done

ls 原则上不应在 shell 脚本中使用以遍历文件。它旨在以交互方式使用,并且几乎从不需要在脚本中使用。此外,全大写的变量名不应用作普通变量,因为它们可能与内部 shell 变量或环境变量发生冲突。


以下是不改目录的版本。

#!/bin/bash

dir=/path/to/file/location

for file in "$dir/"doc?.csv; do
    basename=${file#"$dir/"}
    pair=$dir/pair_$basename
    combined=$dir/combined_${basename#doc}
    cat "$file" "$pair" >> "$combined"
done

【讨论】:

  • 祝福你!谢谢你。这就说得通了。更改目录而不是在 for 循环设置中添加目录 $DIR 是优先考虑的事情,还是像我一样调用 $DIR 被视为不好的做法?另外,如果我需要将每个输出附加到 combine_A.csv、combined_B.csv 等,该怎么办?
  • 实际上,我宁愿将每个输出附加到一个combined.csv文件中
  • @swgRrr 请查看更新后的答案。更改目录并不是绝对必要的,但它使这个特定任务的事情变得容易。否则,需要通过 shell 参数扩展进行一些字符串操作,以便将路径名拆分为路径前缀(目录名)和基本名(路径名的非目录部分)。
【解决方案2】:

这可能对你有用(GNU 并行):

parallel cat {1} {2} \> join_{1}_{2} ::: doc{A..T}.csv :::+ pair_doc{A..T}.csv

cat 命令更改为您选择的命令,其中{1} 代表docX.csv 文件,{2} 代表pair_docX.csv 文件。

注意X 代表字母 AT

【讨论】:

  • 哇,这个可能比我目前的工资等级高一点。我理解流程等,但你能解释一下平行线和冒号系列的作用吗?没有的话我去看看!感谢您的意见!
  • @swgRrr Gnu parallel 是一个值得投入时间的工具。它提供了单行格式循环的可能性,但更多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2023-04-06
  • 2013-09-23
  • 1970-01-01
相关资源
最近更新 更多