以下脚本的目的是通过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