입력으로 다른 파일의 파일 패턴을 바꿔야 합니다.
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
과 유사합니다 .BEGINFILE
BEGIN
END
여기서는 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