我有 2 个文件,第一个文件有输出,另一个文件有模板。我想从输出中在模板中添加 ID,而不对值进行硬编码。
Output.txt,
abc 8392382222
def 9283923829
ghi 2392832930
Template file,
Pool : 1
Some text
Some text
Some text
name:
no:
London
UK
name:
no:
London
UK
name:
no:
London
UK
Pool : 2
Some text
Some text
Some text
name:
no:
London
UK
name:
no:
London
UK
name:
no:
London
UK
我想在模板中添加输出行,如下所示
Pool : 1
Some text
Some text
Some text
name: abc
no: 8392382222
London
UK
name: def
no: 9283923829
London
UK
name: ghi
no: 2392832930
London
UK
Pool : 2
Some text
Some text
Some text
name: abc
no: 8392382222
London
UK
name: def
no: 9283923829
London
UK
name: ghi
no: 2392832930
London
UK
答案1
仅使用 bash,您可以同时读取两个文件:只需将其重定向到不同的文件描述符即可。
#!/bin/bash
while read -r -a values ; do
for i in {0..3} ; do
read -u 3 line
echo "$line ${values[$i]}"
done
done < output.txt 3<template.txt
请注意,通常模板文件只包含应重复的四行,因此您可以将其读入数组前处理包含值的文件,因此您不需要任何额外的描述符:
#!/bin/bash
template=()
while read -r line ; do
template+=("$line")
done < template.txt
while read -r -a values ; do
for (( i=0; i<${#template[@]}; ++i )) ; do
echo "${template[$i]} ${values[$i]}"
done
done < output.txt
答案2
和perl
:
perl -pe '
unless (s{^\h*name:\K\h*$}{($name,$no) = split " ", <STDIN>; " $name"}e) {
s{^\h*no:\K\h*$}{ $no}
}' template < Output.txt
添加就地-i
编辑template
文件的选项,而不是在标准输出上生成结果。
这会保留h
和 之前的水平间距no:
(name:
如果有),并用单个空格和从Output.txt
(在 上打开STDIN
)检索到的值替换后面的间距。