一般来说,我对 unix/bash/code 很陌生,我正在尝试将不同目录中具有相同名称的多个示例文件合并到其自己的目录中的一个新文件(多个数据集合的输出)。
为此,我尝试创建一个使用两个数组的脚本 - listA(每个示例文件的名称)和 list B(新合并的示例文件的名称)。
我的代码看起来有点像这样:
#!/bin/sh
listA=( old1 old2 old3 etc.)
listB=( new1 new2 new3 etc.)
i=0
for i in $listA $listB
do
cp ./folder1/$listA ./merged/$listB
cat ./folder2/$listA >> ./merged/$listB
cat ./folder3/$listA >> ./merged/$listB
cat ./folder4/$listA >> ./merged/$listB
((i=+1))
done
echo "Done stitching"
照原样,它似乎将 listA 中第一个条目的文件完美地合并到 listB 中第一个文件中,但它不会对列表中的后续条目重复该过程。
有什么建议可以让这项工作按预期进行吗?为我的无知道歉,我对这一切都很陌生,并且非常享受学习过程 - 只是有点困惑。
答案1
简短回答
while IFS=$'\t' read -r old new; do cat folder*/"$old" > merged/"$new"; done <list.tsv
这假设list.tsv
包含源(旧)和目标(新)文件的制表符分隔列表。
解释
while IFS=$'\t' read -r old new; FOO; done <list.tsv
:这是一个常见的 shell 结构,用于读取 的每一行list.tsv
,然后FOO
在每一行上执行操作。在这种情况下,输入文件分隔符IFS
是制表符$'\t'
,即该行的第一个字段保存到$old
,第二个字段(制表符之后)保存到$new
。cat folder*/"$old" > merged/"$new"
:连接 中的文件folder*/"$old"
,并将其写入merged/"$new"
.这假设源文件全部位于 中folder*
,例如名为folder1
、folder2
等。- 与任何脚本一样,我肯定会在运行它之前对其进行测试。您可以通过将文件的子集复制到另一个目录,然后使用输入列表的简短版本来做到这一点
list.tsv
。检查结果,如果可以,则真正运行它(但保留备份!)。
关于您建议的解决方案的注释
我只是想对您提出的解决方案写一些评论,以阐明各种命令的工作原理。希望这对您的理解有所帮助!
listA=( old1 old2 old3 etc.)
。这将创建一个数组。显示了访问部分内容的方式这里。正如您(有点)观察到的那样,使用for i in $listA…
只会访问第一个条目。for i in a b c
。这将迭代a
,b
, 和c
,将每个放入$i
.例如,尝试运行for i in a b c; do echo $i; done
.注意,在块$listA
内引用是没有意义的do…done
。同样,i=0
和 也与用法((i=+1))
不一致。for
./folder1/$listA
。./
是不必要的。.
是当前文件夹,因此它在这里不执行任何操作。cat FOO >>
。cat
将自行连接(因此得名)。无需编写附加到文件的单独cat
语句。>>
您可以在 后列出多个文件cat
,例如cat file1 file2 file3 > output_file
。