키로 검색된 두 파일을 병합하고 마지막에 추가

키로 검색된 두 파일을 병합하고 마지막에 추가

두 파일의 데이터를 하나의 파일로 병합하고 열에 흥미로운 값만 추가합니다. 검색 키는 3열의 파일 #1에 있는 UID입니다. 또한 UID 중복 및 빈 줄이 있는 경우 제거/생략해야 합니다.

어떤 설명 방법이라도 읽어보는 것도 좋을 것 같아요 :)

FILE #1:
-----------------
SVCSTO1,dbsrv01,600507600C80012F4000000000000012
SVCSTO1,dbsrv01,600507600C80012F4000000000000014
SVCSTO1,dbsrv02,600507600C80012F40000000000001C0
SVCSTO1,dbsrv02,600507600C80012F40000000000001C1
SVCSTO1,dbsrv01,600507600C80012F40000000000001C2
SVCSTO1,winsrv01,600507600C80012F40000000000001C3

FILE #2:
-----------------
239,dbsrv01_01_T2,4398046511104,600507600C80012F40000000000001C2
240,winsrv01_03_T2,4398046511104,600507600C80012F40000000000001C3
10,dbsrv01_01_T0,0,8589934592000,600507600C80012F4000000000000014
237,dbsrv02_01_T1,4398046511104,600507600C80012F40000000000001C0
238,dbsrv02_02_T2,4398046511104,600507600C80012F40000000000001C1
8,dbsrv01_02_T0,8589934592000,600507600C80012F4000000000000012


DESIRED OUTPUT:
--------------------
SVCSTO1,dbsrv01,600507600C80012F4000000000000012,8589934592000,T0
SVCSTO1,dbsrv01,600507600C80012F4000000000000014,8589934592000,T0
SVCSTO1,dbsrv02,600507600C80012F40000000000001C0,4398046511104,T1
SVCSTO1,dbsrv02,600507600C80012F40000000000001C1,4398046511104,T2
SVCSTO1,dbsrv01,600507600C80012F40000000000001C2,4398046511104,T2
SVCSTO1,winsrv01,600507600C80012F40000000000001C3,4398046511104,T2

아래 예와 같이 데이터 출력을 조작할 수 있지만 배열을 구축하거나 여러 출력을 하나로 결합하는 방법은 경험이 없습니다.

# for i in `cat file1.log | awk -F"," '{print $3}'` ; do cat file2.log | grep $i | awk -F"," '{print $3/1024^3" GB"}'; done
8000 GB
...

답변1

이는 sed입력을 주어진 출력으로만 변환합니다. 필요에 따라 확장할 수 있습니다.

sed -E '/^[0-9]/{s/.*_(.*)(,.*),(.*)/\3\2,\1/;H;d;};G;s/,(.*)\n.*\n\1(,[0-9]*,T[0-9]*).*/\1\2/' file2 file1

이러한 작업에 대한 아이디어는 항상 동일합니다. 먼저 두 번째 파일을 읽어 예약된 공간에 조회 테이블을 작성한 다음 이 조회 테이블을 기본 파일의 각 줄에 추가합니다.

상세히:

  • 이 패턴은 /^[0-9]/숫자로 시작하는 줄을 다루므로 안의 모든 내용이 간단히 {}실행 됩니다.file2
  • s/.*_(.*)(,.*),(.*)/\3\2,\1/두 번째 파일에서 필요한 부분만 이미 필요한 순서대로 추출합니다.
  • H;d예약된 공간의 조회 테이블에 추가하고 행을 삭제합니다. 기타 처리는 다음 용도 file1로만 사용됩니다.
  • G조회 테이블을 추가하고 조회 테이블의 역참조로 s/,(.*)\n.*\n\1(,[0-9]*,T[0-9]*).*/\1\2/키(사이 ,및 개행) 를 조회하여 \1테이블에 필드를 추가합니다.

답변2

또한 AWK를 통해 이 문제를 해결하는 다른 방법을 찾았으며 저를 위해 일하고 있습니다.

awk -F"," 'FNR==NR{a[$4]=$3 FS $2;next}{ print $0","a[$3]}' file1 file2

관련 정보