여러분의 도움이 정말 필요합니다. 저는 유닉스를 처음 접합니다. File2(3열)를 File1(원본 데이터)과 비교하고 결과를 새 파일에 저장하고 싶습니다. 하지만 내 파일에는 다른 구분 기호가 있습니다.
예:
File1 (in tab delimited)
Col1 Col2 Col3 Col4 Col5
a 1 JJ KK DD
b 2 TT RR EE
c 3 QQ ZZ PP
File2 (in pipe delimited)
Col1 Col2 Col3
b TT RR
c QQ ZZ
Result
Col1 Col2 Col3 Col4 Col5
b 2 TT RR EE
c 3 QQ ZZ PP
내 파일이 크고 빠르게 실행하려면 코드가 필요하다는 점에 유의하세요. file1과 일치하려면 file2의 열 3을 일치시켜야 합니다. 감사합니다!
답변1
주문하다
u=`awk 'NR==1{print $0}' fil1`
awk -v u="$u" 'BEGIN {print u}NR==FNR{a[$3];next}($4 in a){print $0}' fil2 fil1
산출
Col1 Col2 Col3 Col4 Col5
b 2 TT RR EE
c 3 QQ ZZ PP
답변2
그것들을 정렬하고(1) 동일한 구분 기호를 사용하도록 다시 형식화한 다음(예: sed(1)) 사용자 정의 일치 프로그램을 수행하여 결과를 처리할 수 있습니다(저는 perl(1)으로 작성하겠지만 옵션이 많이 있을 수 있습니다. 오늘날에는 Python이 더 친숙합니다.)
답변3
file1에서 일치시키려는 항목(열, 전체 행, 정규식, 문자열, 부분 또는 전체 등)을 말하지 않았으므로 이는 추측이지만 어쩌면 그것이 여러분이 원하는 것일 수도 있습니다(file1 열 4는 file2의 열 3에 대한 전체 필드 문자열 일치와 동일합니다.
$ awk 'NR==FNR{a[$3]; next} (FNR==1) || ($4 in a)' FS='[|]' file2 FS='\t' file1
Col1 Col2 Col3 Col4 Col5
b 2 TT RR EE
c 3 QQ ZZ PP
또는 다음과 같을 수도 있습니다(전체 필드 문자열 일치에서 file2의 모든 열을 file2의 특정 열 3개와 순차적으로 비교).
$ awk 'NR==FNR{a[$1,$2,$3]; next} (FNR==1) || (($1,$3,$4) in a)' FS='[|]' file2 FS='\t' file1
Col1 Col2 Col3 Col4 Col5
b 2 TT RR EE
c 3 QQ ZZ PP
하지만 다른 가능성도 수십 가지 있습니다. 귀하가 제공한 예제의 문제점은 귀하가 게시한 예제 입력을 기반으로 예상되는 출력을 생성하는 일치하는 조합이 많다는 것입니다.
답변4
Perl을 사용하는 한 가지 접근 방식은 다음과 같습니다.
$ perl -F'\t' -lane '$"="|";
$h{$_}++,next if @ARGV;
print if $h{"@F[0,2,3]"};
' File2 File1
먼저 File2를 읽고 파이프 기호를 포함하는 것을 기억하면서 file2의 줄로 해시 키를 채웁니다.
그런 다음 file1을 읽고 해당 필드 0, 2, 3을 일치시키고 탭과 파이프로 분할해 봅니다. 게임의 경우 기록을 얻으십시오.