Linux 将多个文件插入到模板中

Linux 将多个文件插入到模板中,linux,awk,sed,data-manipulation,Linux,Awk,Sed,Data Manipulation,我有一个模板文件,需要将多个文件中的数据插入该文件。模板(template.txt)的布局如下: Title Data 1 Data 2 Data 3 我需要把每个数据集放在它的标题下。因此,假设数据文件是: Data1.dat Data2.dat Data3.dat 1 2 3 0 0 0 500 300 100 4 5 6 0 0 0 400 200 000 最终产品需要: Title Data

我有一个模板文件,需要将多个文件中的数据插入该文件。模板(template.txt)的布局如下:

Title
Data 1
Data 2
Data 3
我需要把每个数据集放在它的标题下。因此,假设数据文件是:

Data1.dat      Data2.dat      Data3.dat
1 2 3          0 0 0          500 300 100
4 5 6          0 0 0          400 200 000
最终产品需要:

Title
Data 1
1 2 3
4 5 6
Data 2
0 0 0
0 0 0
Data 3
500 300 100
400 200 000
我怎样才能做到这一点?我可以使用以下方法将一个数据集插入模板:

sed '/Data 1/r Data1.dat' template.txt
我希望能够根据需要对尽可能多的数据文件执行此操作,但我不知道如何实现自动化。

这样就可以了

while read -r line; 
do 
  file=$(echo $line | sed 's/ //;s/$/.dat/');  
  echo $line; 
  if [ -f "$file" ]; then cat "$file"; fi; 
done < template.txt
读取-r行时
;
做
文件=$(echo$行| sed's///;s/$/.dat/);
回声线;
如果[-f“$file”];然后是cat“$file”;fi;
完成
您的帖子中有很多细节可能会影响这一点,但根据您的要求,假设每一行都是确切的文件名,并且删除了空格,缺少.dat扩展名,并且所有文件都存在,这似乎是可行的

$ cat template.txt
  Title
  Data 1
  Data 2
  Data 3


$ awk 'NR==1{print;next;}{print;filename=$0;gsub(" ","",filename);system("cat "filename".dat");}' template.txt
    Title
    Data 1
    1 2 3
    4 5 6
    Data 2
    0 0 0
    0 0 0
    Data 3
    500 300 100
    400 200 000
NR==1{print;next;}
发出第一行,然后转到下一行

{print;filename=$0.dat;gsub(“,”,filename);system(“cat”filename”);}
对于所有其他行,打印该行,将其分配给var和append.dat,然后替换空格并对该文件进行系统调用

另一个例子:

$ awk 'NR==1{print;next;}{print;filename=$0".dat";gsub(" ","",filename);system("cat "filename);}' template.txt
Title
Data 1
1 2 3
4 5 6
Data 2
0 0 0
0 0 0
Data 3
500 300 100
400 200 000
Data 4
4-1     4-2     4-3
4-1     4-2     4-3
4-1     4-2     4-3
Data 5
5-1     5-2     5-3
5-1     5-2     5-3
5-1     5-2     5-3
Data 6
6-1     6-2     6-3
6-1     6-2     6-3
6-1     6-2     6-3
Data 7
7-1     7-2     7-3
7-1     7-2     7-3
7-1     7-2     7-3

sed-e'/Data 1/r Data1.dat'-e'/Data 2/r Data2.dat'-e'Data 3/r Data3.dat'
$ cat tst.awk
NR==FNR {
    if ( FNR==1 ) {
        print
    }
    else {
        filename = $0 ".dat"
        gsub(/[[:space:]]/,"",filename)
        title[filename] = $0
        ARGV[ARGC] = filename
        ARGC++
    }
    next
}
FNR==1 { print title[FILENAME] }
{ print }

$ awk -f tst.awk template.txt
Title
Data 1
1 2 3
4 5 6
Data 2
0 0 0
0 0 0
Data 3
500 300 100
400 200 000