如何通过一个循环编辑和合并多个匹配文件?

如何通过一个循环编辑和合并多个匹配文件?

*编辑:我决定将所有输出附加到一个文件中。

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

我编写了用于编辑和组合 docA.csv 和pair_docA.csv 的代码,但我正在努力编写一个循环来调用上述两个文件,编辑它们,并将它们组合在名称combinedA.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
#output is called temp_doc*.csv

done

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

#code to edit the piar_doc*.csv files ie $pairdoc
#output is called temp_pair*.csv

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

答案1

set -x
DIR=/path/to/file/location
TMPDIR=$(mktemp -d)
rm -f -- "$DIR/combined.csv"

for file in "$DIR"/doc?.csv
do

doc=${file##*/}

#------------ doc processing
temp_doc="$TMPDIR/$doc"

your_code "$file"  > "$temp_doc"

#------------- pair doc processing
pair="$DIR/pair_$doc"
temp_pair="$TMPDIR/$pair"

your_code  "$pair" >  "$temp_pair"


#--------- combine doc+pair
combined="$DIR/combined${doc/doc/}"

your_code "$temp_doc"  "$temp_pair"  > "$combined"
 

cat "$combined" >> "$DIR/combined.csv"
done

注意:将上面三个步骤中的处理代码替换为您的处理代码

  • doc=${file##*/} 上面的结构所做的就是删除 shell 变量 $file 中从左边开始的最后一个 / 星号。请记住,它的头部是 $DIR 。我们只需要简单的基本名称并将结果存储在另一个 shell 变量 $doc 中。

  • 为了将所有内容连接到一个文件中,我添加了最后一个 cat 行。

答案2

免责声明:这绝不是最好的方法,或者从任何角度来看都是最好的方法,但它展示了如何思考这些类型的问题,如果你只是做一次像这样的事情很好,但永远不应该使用除了编写脚本的人之外的其他人,即。请勿放在其他人使用的计算机上。基本原则是认为大多数工作在分解到最小步骤时都是简单的。

我在这篇文章中保留了所有迭代,以便您可以看到非常简单的更改如何改变结果,以便您可以对它们进行比较。当您必须开始测试输入时,困难就来了,但没有任何代码存在,而这些代码将使该代码变得有用,即。添加不同文件名的输入,添加对输入参数的多重检查等。我再次重申,一次性做这样的事情是可以的,但永远不应该用作重复出现的事情的完整答案。

#!/bin/bash
    
     for n in $(ls -1 doc*.csv);
     do
     cat $n >> combinded$n
     cat pair_$n >> combinded$n
  
     mv combinded$n $(echo combinded$n | sed 's/doc//g')
     done

这将获取名为docA.csv和的文件,pair_docA.csv并将它们组合成一个名为 的文件,combinedA.csv保持原始文件不变。它将对目录中遵循相同命名模式的所有文件执行此操作。

注意:这必须在文件所在的目录中运行,并且文件的名称必须与此处显示的一样。

测试:

doc_A.csv doc_B.csv 对_docA.csv 对_docB.csv

输出:

组合A.csv 组合B.csv

编辑:要回答有关将所有内容输出到一个文件的问题,这会将其写入一个名为的文件中combinded.csv

#!/bin/bash
for n in $(ls -1 doc*.csv);
do
cat $n >> combinded.csv
cat pair_$n >> combinded.csv
done

这将以如下格式输出到一个文件中:

  • docA.csv
  • piar_docA.csv
  • docB.csv
  • pair_docB.csv

等等。直到文件末尾。

编辑:要添加目录作为输入和输出变得有点困难,您必须测试参数此脚本需要两个参数,第一个参数是包含文件的目录,第二个参数是输出文件的位置,这两个参数都是强制的。

  #!/bin/bash

  dir=$1
  out=$2
  cd $1
  for n in $(ls -1 doc*.csv);
  do
  cat $n >> combinded$n
  cat pair_$n >> combinded$n

  mv combinded$n $out/$(echo combinded$n | sed 's/doc//g')
  done

示例:./script.sh /path/to/files /path/to/output

两个参数都是需要的

相关内容