n 레코드의 필드 증가(복사)

n 레코드의 필드 증가(복사)

다음과 같은 파일이 있습니다.

A a
2 b
3 c
4 d
5 e
B a
2 b
3 c
4 d
5 e

출력은 다음과 같아야합니다

A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

이 스크립트는 다음과 같습니다.

awk {if ( NR%5 != 1 ) {print VAR, $2} else {print $1, $2} VAR=$1}

작동하지 않습니다(아래 결과):

A a
A b
2 c
3 d
4 e
B a
B b
2 c
3 d
4 e

구문이나 변수 작동 방식에 대해 뭔가 빠진 것 같습니다. awk 스크립팅에 해결책이 있나요?

감사해요

답변1

$ awk '$1 ~ /^[[:upper:]]/ { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

letter이는 필드 시작 부분에서 대문자가 감지되면 변수를 첫 번째 필드의 값으로 설정하기만 하면 됩니다 . 그런 다음 무조건 첫 번째 필드를 저장된 데이터로 설정하고 해당 행을 인쇄합니다.

단순화를 통해 5줄마다 첫 번째 필드를 선택하는 접근 방식을 사용합니다.

$ awk 'FNR % 5 == 1 { letter = $1 } { $1 = letter; print }' file
A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

두 변형 모두에서 나는 무조건 첫 번째 필드를 값으로 설정하고 letter현재 레코드를 인쇄합니다. 이렇게 하면 코드가 단순화됩니다.

코드의 주요 오류는 for VAR로 설정된다는 것입니다.$1모든입력 라인:

{
    if ( NR%5 != 1 ) {
        print VAR, $2
    } else {
        print $1, $2
    }
    VAR = $1  # <-- problem: is triggered on every line
}

답변2

아래 스크립트로 완료

step1: z=`awk 'END{print NR}' filename`
 step2: for ((i=1;i<=$z;i++)); do j=$(($i+4)); u=`awk -v i="$i" 'NR==i{print $1}' o.txt`;sed -n ''$i','$j'p' filename| awk -v u="$u" '{$1=u;print $0}'; i=$j; done

산출

A a
A b
A c
A d
A e
B a
B b
B c
B d
B e

관련 정보