awk 또는 sed를 사용하여 패턴과 줄을 연결합니다.

awk 또는 sed를 사용하여 패턴과 줄을 연결합니다.

기본적으로 SourceField가 포함된 각 행 앞에 쿼리 이름을 입력하고 싶습니다.

나는 이 연결 방식을 시도했다

awk '/<\^Query/ && p{print p;p=""}{p=p $0}END{if(p) print p}' 

하지만 이는 소스 필드가 여러 개 있는 경우에만 작동합니다. 이 경우 모든 행을 SourceField와 연결합니다.

Query: D Monthly Loan SourceField: LOAD-NO         SourceTable: MASTER SourceField: LO  

내 데이터는 다음과 같습니다

Query: D Monthly Loan
    SourceField: LOAD-NO         SourceTable: MASTER
    SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan
    SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1
    SourceField: LOAN-NO         SourceTable: MASTER

출력이 다음과 같기를 원합니다.

Query: D Monthly Loan SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan SourceField: HI              SourceTable: MASTER2
Query: M FORBEARANCE_1 SourceField: LOAN-NO        SourceTable: MASTER

답변1

$ awk '/^ +/{print q, $0; next} {q=$0}' file
Query: D Monthly Loan     SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan     SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan     SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1     SourceField: LOAN-NO         SourceTable: MASTER

또는 다음 형식 중 하나를 선호하는 경우(다른 가능성도 많이 있습니다!):

$ awk 'sub(/^ +/,""){print q, $0; next} {q=$0}' file
Query: D Monthly Loan SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1 SourceField: LOAN-NO         SourceTable: MASTER

$ awk '/^ +/{$1=$1; print q, $0; next} {q=$0}' file
Query: D Monthly Loan SourceField: LOAD-NO SourceTable: MASTER
Query: D Monthly Loan SourceField: LO SourceTable: MASTER
Query: D Monthly Loan SourceField: HI SourceTable: MASTER2
QUERY: M FORBEARANCE_1 SourceField: LOAN-NO SourceTable: MASTER

$ awk -v OFS='\t' '/^ +/{$1=$1; print q, $0; next} {q=$0}' file
Query: D Monthly Loan   SourceField:    LOAD-NO SourceTable:    MASTER
Query: D Monthly Loan   SourceField:    LO      SourceTable:    MASTER
Query: D Monthly Loan   SourceField:    HI      SourceTable:    MASTER2
QUERY: M FORBEARANCE_1  SourceField:    LOAN-NO SourceTable:    MASTER

답변2

sed -n -e '/^Query:\|^QUERY:/{h;}' -e '/^  *SourceField:/{G;s|\(.*\)\n\(.*\)|\2\1|p;}' file
  • /^Query:\|^QUERY:/{h;}Query:/로 시작하는 줄은 QUERY:예약된 공간에 배치됩니다.
  • / *SourceField:/줄이 공백 수에 관계없이 시작되면 다음이옵니다 SourceField:.
    • G개행 문자가 앞에 오는 공간 보존 콘텐츠입니다.
    • s|\(.*\)\n\(.*\)|\2\1|p개행 주위의 필드를 바꾸고 결과를 인쇄합니다.

sed가 확장 정규식을 지원하는 경우 단순화된 버전:

sed -nE -e '/^Query:|^QUERY:/{h;}' -e '/^ +SourceField:/{G;s|(.*)\n(.*)|\2\1|p;}' file

산출:

Query: D Monthly Loan    SourceField: LOAD-NO         SourceTable: MASTER
Query: D Monthly Loan    SourceField: LO              SourceTable: MASTER
Query: D Monthly Loan    SourceField: HI              SourceTable: MASTER2
QUERY: M FORBEARANCE_1    SourceField: LOAN-NO         SourceTable: MASTER

답변3

GNU awk 사용:

awk '/^Q/{query=$0; next}; /^ /{gsub(/^ */,"",$0); print query,$0}' file

산출:

쿼리: D 월별 대출 소스 필드: LOAD-NO 소스 테이블: MASTER
질의: D 월별 대출 출처 필드: LO 출처 테이블: MASTER
질의: D 월별 대출 출처 필드: HI 출처 테이블: MASTER2
쿼리: M FORBEARANCE_1 소스 필드: Loan-No 소스 테이블: MASTER

gsub(/^ */,"",$0)선행 공백을 제거합니다.

답변4

awk '
/^Query:/ || /^QUERY:/ {queryline=$0}
/ SourceField:/ {print queryline " " $0}
' data.txt

관련 정보