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を使用すると、同時に2つのファイルを読み取ることができます。別のファイル記述子にリダイレクトするだけです。
#!/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
通常、テンプレートファイルには繰り返す必要がある4行しか含まれていないため、配列として読み取ることができます。今後値を含むファイルを処理するため、追加の記述子は必要ありません。
#!/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