将一组文件的公共路径提供给 bash 脚本

将一组文件的公共路径提供给 bash 脚本

以下脚本的目的是通过paste命令合并多个表并将它们放在特定目录中。

for i in {1..30}
 do
 paste ./directory"$i"/table1.txt table2.txt ... table20.txt > ./merged_tables/tables_directory"$i".txt
done 

我收到此错误:

 paste: file table2: No such file or directory

通过写入每个表的路径,它可以工作,但我不想多次写入路径,那么有没有其他方法可以在不写入每个表的路径的情况下做到这一点?提前致谢

答案1

for (( i = 1; i <= 30; ++i )); do
    ( cd "directory$i" &&
      paste tableNC023.txt tableNC088.txt tableNC102.txt ... ) >"./merged_tables/tables_directory$i.txt"
done

这用于cd在子 shell 中输入目录。如果cd成功,paste则用于创建组合数据。子 shell 的输出将像以前一样重定向到结果文件。

由于是cd在子 shell 中完成的,因此不需要cd ..cd -cd "$OLDPWD"“后退”以进行下一次迭代。


替代方案,为了更简洁的代码:

tables=( tableNC023.txt tableNC088.txt tableNC102.txt
         more tables here )

for (( i = 1; i <= 30; ++i )); do
    ( cd "directory$i" &&
      paste "${tables[@]}" ) >"./merged_tables/tables_directory$i.txt"
done

我使用for (( i ... ))而不是for i in {...}纯粹基于个人喜好。

答案2

for i in {1..30}
 do
 pushd directory"$i" >/dev/null 2>&1 || continue
 paste table1.txt table2.txt ... table20.txt > ../merged_tables/tables_directory"$i".txt
 popd >/dev/null 2>&1
done

答案3

由于您已经在使用大括号扩展,因此您也可以在此处使用它。

要么让扩展生成数字序列(..是文字):

for i in {1..30}; do
    paste ./directory"$i"/table{1..20}.txt > ./merged_tables/tables_directory"$i".txt
done 

或者手动列出它们(填写...):

for i in {1..30}; do
    paste ./directory"$i"/table{1,2,...,20}.txt > ./merged_tables/tables_directory"$i".txt
done 

也就是说,假设您不仅仅想要目录中与模式匹配的所有文件:

for i in {1..30}; do
    paste ./directory"$i"/table*.txt > ./merged_tables/tables_directory"$i".txt
done 

相关内容