在给定目录中,我有9个文件夹,每个文件夹都用其编号标记,还有一个名为“文件”的文件夹,例如:
ls
1 2 3 4 5 6 7 8 9 files
1-9中的每个文件夹都包含另一组1-7文件夹:
cd 1/
ls
1 2 3 4 5 6 7
1-7中的每个文件夹都有一个输入文件,其名称取决于目录,因此(例如)文件夹8中文件夹3的输入文件称为“ 8-3.inp”,并且文件夹1中文件夹2的输入文件为“ 1-2.inp”
在“文件”文件夹中,我还有9个文件夹,分别标记为1-9。在这9个文件夹中的每个文件夹中,我都有7个文本文件,因此,这9个文件夹中的任何一个都将包含:
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt
我想将txt文件的所有内容粘贴到相应输入文件夹的第26行。例如,我希望将/files/8/2.inp的所有文本内容复制到/8/2/8-2.inp的第26行
有没有办法做到这一点?我认为可以使用sed命令完成操作,但是如何关联要复制的文件的所有索引在正确的位置?
答案 0 :(得分:0)
不确定我已完全理解您的问题。但是这里有一个简单的bash脚本应该可以完成这项工作。它使用sed
功能将操作应用于地址范围。
tmpfile=tmpfile
for i in $(seq 1 9)
do
for j in $(seq 1 7)
do
ifile2=$i/$j/$i-$j.inp
# ofile is identical to ifile2. Give ofile it a different extension for testing
ofile=$i/$j/$i-$j.inp
ifile=files/$i/$j.inp
# copy lines 1-25 to tempfile
# -n option suppresses normal sed output,
# on selected range (1,25) print lines (p)
sed -n '1,25p' <$ifile2 > $tmpfile;
# append input file to tempfile
cat $ifile >> $tmpfile
# append files 27-end to tempfile.
# just ask sed to delete lines 1-26 and to print others (default sed behavior)
# note line 26 is suppressed
sed '1,26d' <$ifile2 >> $tmpfile
# move tempfile to result file
mv $tmpfile $ofile
done
done
答案 1 :(得分:0)
这可能对您有用(GNU sed和并行):
parallel sed -i -e \'26rfiles/{1}/{2}.txt\' -e \'26d\' {1}/{2} ::: {1..9} ::: {1..7}
使用parallel简化循环,并用sed将每个文件的第26行替换为files目录中同名文件的内容。