【问题标题】:Inserting multiple files into a template将多个文件插入模板
【发布时间】:2017-04-28 17:26:07
【问题描述】:

我有一个模板文件,需要将多个文件中的数据插入到该文件中。模板(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

我希望能够根据需要对尽可能多的数据文件执行此操作,但不知道如何实现自动化。

【问题讨论】:

  • sed -e '/Data 1/r Data1.dat' -e '/Data 2/r Data2.dat' -e 'Data 3/r Data3.dat'?

标签: linux awk sed data-manipulation


【解决方案1】:

这样就可以了……

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

【讨论】:

    【解决方案2】:

    您的帖子中遗漏了很多可能会影响这一点的细节,但鉴于您的要求,假设每一行都是删除空格且缺少 .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
    

    【讨论】:

      【解决方案3】:
      $ 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多