awk: 두 파일의 복사본을 인쇄합니다.

awk: 두 파일의 복사본을 인쇄합니다.

파일 1:

23455|abc|xyz
23455|abc|xsd
34433|wer|sad
45655|fdf|fcd

파일 2:

v343v|23455
z565z|23455
c9898|34433
b2323|45655

출력은 다음과 같아야 합니다.

23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

다음 명령을 사용하고 있습니다.

awk -F'|' 'NR==FNR { a[$1]=$1"|"$2"|"$3; next} $2 > 0 {print a[$2] "|" $1}' file1 file2 > result.txt

하지만 결과만 표시됩니다.

23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

참고: 두 파일의 데이터는 무작위 순서로 되어 있습니다.

답변1

$ join -t '|' -2 2 file1 file2
23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

그러면 두 파일에 대해 관계형 JOIN 작업이 수행됩니다. 입력 데이터에서 필드 구분 기호로 사용되도록 지시 -t '|'하고 두 파일 중 첫 번째 파일 대신 두 번째 파일의 두 번째 필드를 사용하도록 지시합니다 join.|-2 2

이는 조인 열이 두 파일 모두에서 정렬되어 있다고 가정합니다.

정렬되지 않은 경우 다음을 사용하여 파일을 미리 정렬합니다.

sort -t '|' -k1 -o file1 file1
sort -t '|' -k2 -o file2 file2

join또는 프로세스 대체를 사용하여 이 기능을 지원하는 셸에서 호출과 동시에 정렬합니다 .

join -t '|' -2 2 \
    <( sort -t '|' -k1 file1 ) \
    <( sort -t '|' -k2 file2 )

답변2

사용 awk:

awk 'BEGIN{FS=OFS="|"}NR==FNR{a[$0];next}{for(i in a)if(index(i,$2)==1) print i,$1}' file1 file2

for배열에 저장된 file1의 모든 행을 반복합니다 a. 두 번째 파일의 첫 번째 요소가 배열 항목과 일치하면 인쇄합니다.

관련 정보