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
또는 더 강력할 수도 있습니다(구분 기호가 단일 공백 이라고 가정하지 않기 때문에 ) 명시적인 SUBSEP
awk 변수를 활용하세요.에드 모튼이 제안한 것처럼:
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 쉘 변수를 삽입합니다. 또한 글을 작성할 때 명확성을 위해 공백을 뿌렸는데 이제는 제거해야 합니다. P
b.txt의 블록 번호 3, 5, 7,8 및 9가 a.txt 줄의 아무 곳에서나 발견되면 패턴 공간의 앞부분을 인쇄합니다.