고정 너비 파일의 헤더 열 중 하나를 복사하고 세부 레코드에 새 필드를 만든 다음 해당 필드를 해당 자리 표시자에 붙여넣어야 합니다.
참고: 파일에는 여러 헤더와 세부 레코드가 있으며, 샘플 파일 데이터의 예상 출력은 다음과 같습니다.
레코드 유형: H-헤더, D-세부사항.
입력하다:
H0003A
D0001A
D0002A
D0003A
H0007A
D0001A
D0002A
D0003A
D0004A
D0005A
D0006A
D0007A
H0002B
D0001B
D0002B
H0004A
D0001A
D0002A
D0003A
D0004A
예상 출력:
H0003A
D0001A3
D0002A3
D0003A3
H0007A
D0001A7
D0002A7
D0003A7
D0004A7
D0005A7
D0006A7
D0007A7
H0002B
D0001B2
D0002B2
H0004A
D0001A4
D0002A4
D0003A4
D0004A4
답변1
따라서 각 헤더 줄의 5번째 문자를 제목이 아닌 줄의 끝에 추가하고 싶을 것입니다. 전혀:
awk 'BEGIN{OFS=FS=""} /^H/ {x = $5} /^D/ {$(NF+1) = x} 1'
또는 (약간 더 입력하지만 정규식 비교는 피함)
awk 'BEGIN{OFS=FS=""} $1=="H" {x = $5} $1=="D" {$(NF+1) = x} 1'
Perl에서도 유사합니다:
perl -F'' -ple '$_ .= $x if $F[0] eq "D"; $x = $F[4] if $F[0] eq "H"'
고집스럽고 비뚤어진 사람들에게는
sed -e '/^H/ {p;s/.$//;h;d;}' -e '/^D/ {G;s/\n....//;}'
답변2
Bash는 일반적으로 텍스트 프로세서로 사용되어서는 안 되지만 더 나은 솔루션이 게시되지 않은 경우 다음과 같이 작업을 수행하면 됩니다.
#!/bin/bash
input=/path/to/input
output=/path/to/output
while read -r record; do
if [[ "${record:0:1}" == 'H' ]]; then
x=$(awk -vr=${record//[[:alpha:]]/} 'BEGIN{print r / 1}')
echo "$record"
elif [[ -z "$record" ]]; then
echo
else
echo "${record}${x}"
fi
done <"$input" >"$output"
입력 내용을 한 줄씩 읽습니다. 레코드가 H
시작하는 경우 해당 숫자를 가져와서 1로 나누어(앞에 오는 0을 제거함) 이를 변수에 저장한 x
다음 echo
레코드를 출력 파일에 저장합니다. 레코드가 빈 줄인 경우 echo
출력에는 빈 줄이 하나만 포함됩니다. 레코드가 an으로 시작하지 않으면 변수로 끝 H
납니다 .echo
x
답변3
GNU awk를 사용하여 추가된 모든 숫자가 단지 1자리가 아니라고 가정
gawk 'match($0, /^H0*([0-9]+)/, m) {n = m[1]} /^D/ {$0 = $0 n} 1' file