将多个文件插入模板

时间:2017-04-28 17:26:07

标签: 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 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

我希望能够根据需要为尽可能多的数据文件执行此操作,并且无法弄清楚如何自动化它。

3 个答案:

答案 0 :(得分:0)

这会......

while read -r line; 
do 
  file=$(echo $line | sed 's/ //;s/$/.dat/');  
  echo $line; 
  if [ -f "$file" ]; then cat "$file"; fi; 
done < template.txt

答案 1 :(得分:0)

您的帖子中遗漏了很多可能会影响此问题的详细信息,但考虑到您的要求,这似乎可行,假设每行都是删除了空格且缺少.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并附加.dat,然后替换空格并对cat该文件进行系统调用。

另一个例子:

$ 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

答案 2 :(得分:0)

$ 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