从一个文件中获取值(通过awk)并在另一个文件中使用它们(通过sed)

时间:2017-10-03 18:51:34

标签: bash awk sed gawk distinct-values

我正在使用gawk来获取某些值,但不是文件中的所有值。我有另一个文件是我将用来替换某个部分的模板,然后生成一个特定于我抓取的值的文件。我想用sed替换模板中的这些感兴趣的字段。

  the dog NAME , likes to ACTION in water when he's bored

另一个文件f1将具有狗的名称和动作

   Maxs,swim
   StoneCold,digs
   Thor,leaps

所以我可以抓住这些值并将它们存储到一个关联数组中...我不能做什么,或者看看,我如何将这些值添加到我的sed脚本中? 所以一个简单的sed脚本就像这样

s/NAME/ value from f1
s/ACTION/ value from f1

所以我对模板的推出将是

  the dog Maxs , likes to swim in water when he's bored

因此,如果我运行了一个bash文件,该命令将看起来像这样,或者我尝试过的

    gawk -f f1 animalNameAction | sed -f (is there a way to put something here) template | cat

       gawk -f f1 animalNameAction > PulledValues| sed -f PulledValues template | cat

但这些都没有奏效。所以我想知道如何做到这一点。

1 个答案:

答案 0 :(得分:2)

您可以使用awk本身

来执行此操作

我假设,模板可以是多行字符,

  • 所以在FNR==NR{}块中,我将整个文件(模板)内容保存在变量t中,
  • 在其他块中,我用逗号分隔文件中的第一个和第二个字段替换了NAMEACTION

以下是示例:

$ cat template 
the dog NAME , likes to ACTION in water when he's bored

$ cat file 
Maxs,swim
StoneCold,digs
Thor,leaps

$ awk 'FNR==NR{ t = (t ? t RS :"") $0; next}{ s=t; gsub(/NAME/,$1,s); gsub(/ACTION/,$2,s); print s}' template FS=',' file 
the dog Maxs , likes to swim in water when he's bored
the dog StoneCold , likes to digs in water when he's bored
the dog Thor , likes to leaps in water when he's bored

更好的可读性:

awk 'FNR==NR{ 
              t = (t ? t RS :"") $0; 
              next
     }
     {  
         s=t; 
         gsub(/NAME/,$1,s); 
         gsub(/ACTION/,$2,s); 
         print s
     }
     ' template FS=',' file