NR==FNR, 두 파일이 일치하면 수정해야 함 [닫기]

NR==FNR, 두 파일이 일치하면 수정해야 함 [닫기]

b.txt 파일의 행이 일치하면 항목에서 a.txt 행을 수정하고 싶지만(즉, $1을 b.txt 파일의 $2로 대체) 작동하지 않습니다.

입력하다

*a.txt*
201 A B 580 D1
208 A B 581 D2
214 A B 582 D3

*b.txt*
10 101 E1 A Z1 B Z2 580 Z3
11 104 E2 C Z1 B Z2 581 Z3
12 107 E3 A Z1 B Z2 581 Z3
14 111 E3 B Z1 S Z2 582 Z3
15 116 E2 A Z1 B Z2 582 Z3

산출

*c.txt*
101 A B 580 D1
107 A B 581 D2
116 A B 582 D3
10 101 E1 A Z1 B Z2 580 Z3
12 107 E3 A Z1 B Z2 581 Z3
15 116 E2 A Z1 B Z2 582 Z3

내 코드

awk 'NR==FNR{pattern[$0]; next} {if($4" "$6" "$8 in pattern) {print $0; gsub(pattern[$1],$2); print pattern[$0]}}' a.txt b.txt >> c.txt

내 코드에 무슨 문제가 있나요? 결과가 없나요?

답변1

수정된 질문에 대한 답변:

awk 'NR==FNR {$1=""; afile[$2, $3, $4]=$0; next; }
    (($4, $6, $8) in afile){ print $2 afile[$4, $6, $8]; }1' a.txt b.txt

이전 버전의 질문에 유효합니다.

$ awk 'NR==FNR { afile[$2, $3, $4]=1; next; } 
       (($4, $6, $8) in afile){ print $2, $4 ,$6 , $8; }1' a.txt b.txt >c.txt

a.txt2, 3, 4 열만 이라는 연관 배열로 읽은 afile다음 두 번째 파일의 4, 6, 8에서 해당 열을 비교하고 b.txt배열에 표시되면$1 전체 두 번째 파일을 인쇄합니다. 필수 열과 나머지 열 4, 6, 8. 그렇지 않으면 기본값은 1일치하지 않는 행을 인쇄하는 것입니다.

결과 c.txt:

101 A B 580
10 101 E1 A Z1 B Z2 580 Z3
11 104 E2 C Z1 B Z2 581 Z3
107 A B 581
12 107 E3 A Z1 B Z2 581 Z3
14 111 E3 B Z1 S Z2 582 Z3
116 A B 582
15 116 E2 A Z1 B Z2 582 Z3

하지만 코드에 문제가 있습니다.

awk 'NR==FNR{pattern[$0]; next} {if($4" "$6" "$8 in pattern) {print $0; gsub(pattern[$1],$2); print pattern[$0]}}' a.txt b.txt >> c.txt
  1. pattern[$0]: 각 전체 행을 추가할 수 있습니다.무늬첫 번째 입력 " "의 a.txt연관 배열 ;

  2. $4" "$6" "$8다음으로, 두 번째 파일의 열 #4, #6, #8을 b.txt해당 배열의 행과 비교합니다. 전체 행을 존재하지 않는 특정 열 값과 비교하기 때문에 일치하지 않습니다.무늬대량으로.

  3. 2단계는 결코 만족되지 않기 때문에 if 문의 내부 블록은 결코 실행되지 않습니다.

답변2

먼저 짝수 필드를 염두에 두고 8개의 블록/필드로 구성된 정규식을 작성합니다. 정규식은 확장된 정규식 모드를 사용하는 gnu sed를 기반으로 합니다.

$ re='\S+ (\S+)'
$ for i in 1 2; do re="$re $re"; done
$ sed -En "/\n/{P;d;}
    s/\s+/ /g;s/^ | \$//g
    /(\S+ ){6}/bb
    s/^\S+ //;H;d
    :b;G
    /^$re .*\n(\2 \3 \4 \S+)/{
      s//\1 \5\n&/;P;D
    }
" a.txt b.txt \
| sed -e 'n;H;2h;$!d;g'

산출:

101 A B 580 D1
107 A B 581 D2
116 A B 582 D3
10 101 E1 A Z1 B Z2 580 Z3
12 107 E3 A Z1 B Z2 581 Z3
15 116 E2 A Z1 B Z2 582 Z3

관련 정보