영숫자 모드로 (대형) 파일 결합

영숫자 모드로 (대형) 파일 결합

나는 가지고있다:

다음과 같은 파일 1:

sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters*ALPHANUMERIC_PATTERN

다음과 같은 파일 2:

sting_of_printable_characters*ALPHANUMERIC_PATTERN

필드 구분 기호는 어디에 *있으며 영숫자 모드는 항상 행의 마지막 필드입니다.
나는 다음을 달성하는 방법을 전혀 모르고 도움이 필요합니다.

기본적으로 "ALPHANUMERIC_PATTERN"을 기반으로 하는 이 두 파일을 "결합"하고(명령을 시도했지만 join영숫자 키로는 작동하지 않는 것 같습니다) 두 파일에 동일한 ALPHANUMERIC_PATTERN이 포함된 경우에만 인쇄해야 합니다.

awk나는 처리 효율성 때문에 이것을 사용하는 것을 선호 하지만 무엇이든 매우 도움이 될 것입니다. (이 파일은 용량이 큽니다.)

문제는 다음과 유사한 출력을 확인해야 한다는 것입니다.

ALPHANUMERIC_PATTERN*stuff_from_file_1*stuff_from_file_2

답변1

다음을 시도해 볼 join수 있습니다.

join -t\* \
<(sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file1 | sort -t\* -k1,1) \
<(sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file2 | sort -t\* -k1,1)

두 개의 seds는 마지막 필드를 줄의 시작 부분으로 이동합니다.

field1*field2*...field(N-1)*field(N)

~이 되다

field(N)*field1*field2*...*field(N-1)

그런 다음 결과는 st 필드와 st 필드 sort1차례로 적용됩니다 join(항상 1st 필드에 있음). 그러면 다음과 같은 줄이 인쇄됩니다.

field(N)*fields(1)to(N-1)*from*file1*fields(1)to(N-1)*from*file2 

임시 파일을 사용하고 join결과를 다음과 같이 저장 하려는 경우 outfile:

sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file1 | sort -t\* -k1,1 > sorted_1
sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file2 | sort -t\* -k1,1 > sorted_2
join -t\* sorted_{1,2} > outfile
rm -f sorted_{1,2}

답변2

필드 수가 고정되어 있으면 마지막 필드를 직접 추가할 수 있습니다.

join -t \* -1 4 -2 2 file1 file2
ALPHANUMERIC_PATTERN*sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters

물론 두 필드 모두 조인하려는 필드에 따라 정렬되어야 합니다. 그렇지 않은 경우 don_crissti가 보여주는 기술을 사용할 수 있습니다.

joint -t \* -1 4 -2 2 <(sort -k4 file1) <(sort -k2 file2)

관련 정보