나는 가지고있다:
다음과 같은 파일 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)
두 개의 sed
s는 마지막 필드를 줄의 시작 부분으로 이동합니다.
field1*field2*...field(N-1)*field(N)
~이 되다
field(N)*field1*field2*...*field(N-1)
그런 다음 결과는 st 필드와 st 필드 sort
에 1
차례로 적용됩니다 join
(항상 1
st 필드에 있음). 그러면 다음과 같은 줄이 인쇄됩니다.
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)