将文本复制到相应文件夹的相应文件中

时间:2019-03-09 09:57:17

标签: bash unix sed

在给定目录中,我有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命令完成操作,但是如何关联要复制的文件的所有索引在正确的位置?

2 个答案:

答案 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目录中同名文件的内容。