根据源和目标中的位置使用awk替换字符串

时间:2017-10-31 14:56:43

标签: string bash awk replace position

假设多行文本文件file1,其中某些行包含关键字“ keyw ”。

$ cat file1
foo
bar keyw
baz
keyw qux
quux

进一步假设单行文本文件file2包含与file1中关键字出现次数一样多的字符串。 file2中的字符串由单个空格分隔。

$ cat file2
string1 string2

我想根据相应的位置将file2的每个字符串附加到包含关键字的file1行:

  • file2中的第一个字符串附加到file1中包含关键字的第一行。

  • file2中的第二个字符串附加到file1中包含关键字的第二行。

以下是所寻求的输出:

$ awk ... file1 file2
foo
bar keyw string1
baz
keyw qux string2
quux

你会用什么 awk -code进行替换?

3 个答案:

答案 0 :(得分:0)

如果您的Input_file与显示的示例相同,那么您可以尝试关注并告诉我这是否对您有帮助。

awk 'FNR==NR{for(i=1;i<=NF;i++){a[i]=$i}next} {print $0,$0 ~ /keyw/?a[++j]:""}' FIlE2  FIlE1

输出如下。

foo
bar keyw string1
baz
keyw qux string2
quux

此处也添加说明。

awk '
FNR==NR{            ##Using FNR==NR condition which will be RUE when first Input_file is getting read. FNR and NR both represents number of lines, only difference between them is FNR value will be RESET on every next file is getting read and NR value will be keep on increasing till all the files are read.
 for(i=1;i<=NF;i++){##Starting a for loop which will run from i variable value 1 to till value of variable NF, where NF is out of the box variable whose value is the value of number of fields on a line.
  a[i]=$i}          ##Creating an array named a whose index is variable i and its value is $i(specific fields value)
  next              ##next will skip all further statements for current line(s).
}
{                   ##These statements will be executed when 2nd Input_file is being read.
  print $0,$0 ~ /keyw/?a[++j]:"" ##Printing the value of current line along with that checking of a line has string keyw in it then printing the value of array a whose index is value of j(whose value increments with 1 each time it comes here), else print NULL/nothing.
}
' FIlE2  FIlE1      ##mentioning the Input_file(s) here.

答案 1 :(得分:0)

下面给出了上面显示的所需o / p,

使用awk

awk '
     FNR==NR{split($0,strarr);next}
     /keyw/{$0 = $0 OFS strarr[++i]}1
    ' file2 file1

既然你说过,

  

进一步假设包含尽可能多的单行文本文件file2   字符串作为file1中的关键字出现次数。 file2中的字符串是   由单个空格分隔。

<强>解释

  • split($0,strarr);被使用,因此它将默认FS单个空格拆分记录,元素保存在数组strarr

  • 因此,每当记录与file1的regexp /keyw/匹配时,我们打印数组元素,变量i将递增,并转到下一行/记录

  • 最后
  • +1执行默认操作,即打印当前/记录/行,print $0。要知道awk如何工作,请尝试awk '1' infile,它将打印所有记录/行,而awk '0' infile则不打印任何内容。除零以外的任何数字都是 true ,这会触发默认行为。

测试结果:

$ cat file1
foo
bar keyw
baz
keyw qux
quux

$ cat file2
string1 string2

$ awk 'FNR==NR{split($0,strarr);next}/keyw/{$0 = $0 OFS strarr[++i]}1' file2 file1
foo
bar keyw string1
baz
keyw qux string2
quux

答案 2 :(得分:0)

这就是你所需要的:

awk 'FNR==NR{split($0,a);next} /keyw/{$0=$0 OFS a[++c]} 1' file2 file1

它可以在任何awk中工作,并且不会在非目标行的末尾添加空格。