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
일반적으로 템플릿 파일에는 반복되어야 하는 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