열의 패턴 바꾸기

열의 패턴 바꾸기

입력으로 다른 파일의 파일 패턴을 바꿔야 합니다.

file1의 내용을 가정합니다.

ab 10
bc 20
cd 30
de 40

파일 2:

server1;10 feb 2020;disk5;123455678;comment;10;1;desc;abcde3;987654
server1;10 feb 2020;disk6;123455678;comment;10;7;desc;abcde3;987654
server1;10 feb 2020;disk10;123455678;comment;20;4;desc;abcde3;987654
server1;10 feb 2020;disk1;123455678;comment;30;5;desc;abcde3;987654
server1;10 feb 2020;disk9;123455678;comment;20;4;desc;abcde3;987654
server1;10 feb 2020;disk2;123455678;comment;40;6;desc;abcde3;987654
server1;10 feb 2020;disk5;123455678;comment;30;8;desc;abcde3;987654

여기서는 ;file2의 구분 기호로 열 6을 file1의 일치하는 값으로 바꾸고 싶습니다.

server1;10 feb 2020;disk5;123455678;comment;**ab**;1;desc;abcde3;987654

awk/ 를 통해 작동한다는 것을 알고 있습니다 sed. 도울 수 있니? 참고: 우리는 awk/ sed의 GNU 버전을 AIX.

답변1

$6 값이 모두 file1에 포함되어 있다고 가정하고 시도해 보세요.

awk 'FNR == NR {T[$2] = $1; next} {$6 = T[$6]} 1' file1 FS=";" OFS=";" file2

답변2

이 연습의 어려움은 동일한 프로그램 awk에서 다양한 필드 구분 기호를 처리하는 방법입니다.

GNU 사용 awk:

$ gawk 'FNR == NR { pat[$2] = $1; next } ($6 in pat) { $6 = pat[$6] } { print } ENDFILE { OFS = FS = ";" }' file1 file2
server1;10 feb 2020;disk5;123455678;comment;ab;1;desc;abcde3;987654
server1;10 feb 2020;disk6;123455678;comment;ab;7;desc;abcde3;987654
server1;10 feb 2020;disk10;123455678;comment;bc;4;desc;abcde3;987654
server1;10 feb 2020;disk1;123455678;comment;cd;5;desc;abcde3;987654
server1;10 feb 2020;disk9;123455678;comment;bc;4;desc;abcde3;987654
server1;10 feb 2020;disk2;123455678;comment;de;6;desc;abcde3;987654
server1;10 feb 2020;disk5;123455678;comment;cd;8;desc;abcde3;987654

여기서는 첫 번째 파일 읽기를 시작하고 pat나중에 열 6에서 대체하려는 내용으로 연관 배열을 채웁니다. 키는 우리가 대체하는 것이고 값은 우리가 대체하는 것입니다.

GNU는 awk파일 읽기를 마치면 ENDFILE블록이 있으면 실행합니다( BEGINFILE어떤 경우에는 유용할 수 있는 블록도 있습니다). "파일 로컬" 및 블록 ENDFILE과 유사합니다 .BEGINFILEBEGINEND

여기서는 ENDFILE입력 및 출력 필드 구분 기호를 세미콜론으로 변경합니다.

두 번째 파일을 읽을 때 6번째 필드의 데이터가 키로 사용될 수 있는지 간단히 테스트하고 pat, 그렇다면 그 값을 해당 키의 값으로 바꿉니다. 두 번째 파일의 모든 줄은 수정 여부에 관계없이 인쇄됩니다.

GNU가 아닌 경우 awk다음을 수행할 수 있습니다.

$ awk 'FNR == NR { pat[$2] = $1; next } { OFS = FS = ";"; $0=$0 } ($6 in pat) { $6 = pat[$6] } { print }' file1 file2
server1;10 feb 2020;disk5;123455678;comment;ab;1;desc;abcde3;987654
server1;10 feb 2020;disk6;123455678;comment;ab;7;desc;abcde3;987654
server1;10 feb 2020;disk10;123455678;comment;bc;4;desc;abcde3;987654
server1;10 feb 2020;disk1;123455678;comment;cd;5;desc;abcde3;987654
server1;10 feb 2020;disk9;123455678;comment;bc;4;desc;abcde3;987654
server1;10 feb 2020;disk2;123455678;comment;de;6;desc;abcde3;987654
server1;10 feb 2020;disk5;123455678;comment;cd;8;desc;abcde3;987654

이것은 약간 비효율적이지만 두 번째 파일의 각 줄에 대해 합계를 설정 OFS하고 입력을 FS다시 분할하는 것입니다.;

약간 더 효율적이지만 여전히 보기 흉한 변형은 두 번째 파일의 첫 번째 줄만 설정하는 것입니다 OFS.FS

awk 'FNR == NR { pat[$2] = $1; next } FS != ";" { OFS = FS = ";"; $0=$0 } ($6 in pat) { $6 = pat[$6] } { print }' file1 file2

관련 정보