다른 파일의 여러 데이터가 포함된 파일 구문 분석

다른 파일의 여러 데이터가 포함된 파일 구문 분석

a.txt의 3개 데이터(A, B, num:xxx)를 기반으로 b.txt의 행을 선택하고 싶습니다.

a.txt

A B num : 580
A B num : 581
A B num : 582

b.txt

10 E1 A Z1 B Z2 num : 580 Z3 582 Z4
11 E2 C Z1 B Z2 num : 581 Z3 580 Z4
12 E3 A Z1 B Z2 num : 581 Z3 580 Z4
14 E3 S Z1 B Z2 num : 582 Z3 581 Z4
15 E2 A Z1 B Z2 num : 582 Z3 581 Z4

산출

10 E1 A Z1 B Z2 num : 580 Z3 582 Z4
12 E3 A Z1 B Z2 num : 581 Z3 580 Z4
15 E2 A Z1 B Z2 num : 582 Z3 581 Z4

내 코드

awk 'NR==FNR{pattern[$0];next} ($3 && $5 && "$7 $8 $9" in pattern)' a.txt b.txt > GoodFile.txt

이게 무슨 문제야? 감사해요.

답변1

연관 배열의 키는 pattern다음과 같습니다.문자열 연결필드 및 필드 구분 기호, 즉

$ awk 'NR==FNR{pattern[$0]; next} $3" "$5" "$7" "$8" "$9 in pattern' a.txt b.txt
10 E1 A Z1 B Z2 num : 580 Z3 582 Z4
12 E3 A Z1 B Z2 num : 581 Z3 580 Z4
15 E2 A Z1 B Z2 num : 582 Z3 581 Z4

a.txt또는 더 강력할 수도 있습니다(구분 기호가 단일 공백 이라고 가정하지 않기 때문에 ) 명시적인 SUBSEPawk 변수를 활용하세요.에드 모튼이 제안한 것처럼:

awk 'NR==FNR{pattern[$1,$2,$3,$5]; next} ($3,$5,$7,$9) in pattern' a.txt b.txt

답변2

확장 GNU sed정규식 모드를 켜고 -E자동 인쇄 모드 공간을 끄면 -n그림과 같이 해결할 수 있습니다.

먼저 sed 코드 작성을 단순화하기 위해 몇 가지 보조 쉘 변수를 정의합니다.

$ f='(\S+)' g='\s+\S+\s+' fg="$f$g"
$ Ss='\S+\s+' fs="$f\s+"
$ re="$Ss $Ss $fg $fg $fs $fs $fs"
$ sed -En "
    s/$f/&/6;tb
    s/\s+/ /g;s/^ | \$//g
    H;d
    :b;G
    \#^${re// /}.*\n\1 \2 \3 \4 \5(\n|$)#P
" a.txt b.txt

¶ 먼저, 공백이 아닌 6번째 블록의 존재로 a.txt 또는 b.txt의 행을 식별합니다. 그렇다면 파일 b.txt이고 sed 코드의 레이블 b로 이동합니다.

¶ 그렇지 않으면 a.txt 파일의 경우 줄을 자르고 공백을 압축합니다. 그런 다음 저장하십시오.

¶ b.txt 파일의 행에 대해 b.txt의 행 구조에 따라 작성된 $re 쉘 변수를 삽입합니다. 또한 글을 작성할 때 명확성을 위해 공백을 뿌렸는데 이제는 제거해야 합니다. Pb.txt의 블록 번호 3, 5, 7,8 및 9가 a.txt 줄의 아무 곳에서나 발견되면 패턴 공간의 앞부분을 인쇄합니다.

관련 정보