열이 다른 파일과 일치하면 일치하는 각 줄을 인쇄합니다(awk/grep).

열이 다른 파일과 일치하면 일치하는 각 줄을 인쇄합니다(awk/grep).

두 개의 입력 파일이 있는데, 하나는 일부 ID 번호를 포함하고 다른 하나는 많은 수의 ID 번호와 추가 열을 포함합니다. 후자의 파일에는 각 ID 번호에 대한 여러 줄이 포함되어 있으며 첫 번째 파일에서 ID와 일치하는 모든 줄을 추출해야 합니다. 그런 다음 이 줄을 새 파일에 인쇄해야 합니다.

편집 1: 예제 파일을 실제 발췌문으로 대체했습니다.

편집 2: 발췌 부분에서 추가 공백을 제거했지만 실제 파일에서는 제거하지 않았습니다. 어떤 방식으로든 파일을 정리해야 할 수도 있지만 정확한 방법은 불분명합니다.

파일 1:

AT1G56430
AT3G55190
AT3G22880

파일 2:

AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

예상 출력

AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

[ 파일 1초[파일2ss

나는 시도했다:

awk -F'|' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2 > output.txt

그리고:

grep -Ff file2 file1 > output.txt

나는 이 포럼과 다른 포럼에 비슷한 질문이 많이 게시되어 있다는 것을 알고 있습니다. 그러나 이것들은 출력으로 무엇을 해야할지 언급하지 않으며 복제에 대해서도 언급하지 않습니다. 저는 이 솔루션 중 4가지를 시도했고 몇 시간 동안 이 문제를 해결해 보았지만 계속해서 같은 문제에 직면했습니다: 빈 출력 파일.

저는 awk를 처음 접했고 도움을 주시면 정말 감사하겠습니다. 구문 등에 대한 간단한 질문이라면 죄송합니다. 도와주셔서 감사합니다.

답변1

AWK 스크립트가 거의 완료되었습니다.

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1] > 0' file1 file2 > output.txt

이는 Mac에서 Unix로 줄 끝을 변경한 후에 작동합니다.

tr '\r' '\n' < file1 > file1.new
mv file1.new file1
tr '\r' '\n' < file2 > file2.new
mv file2.new file2

$1AWK의 첫 번째 필드입니다.

대신 c[$1] > 0을 쓸 수 있습니다 c[$1]. 필요 없음 > 0: 0이 아닌 값이면 모두 가능하므로 c다음을 사용하는 것이 좋습니다.

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1]' file1 file2 > output.txt

답변2

이 awk 명령을 사용해 보세요.

bash-4.1$ cat file1
1
3

bash-4.1$ cat file2
1|A|B
1|C|D
2|E|F
3|G|H

bash-4.1$ awk -F\| 'NR==FNR{F1[$0];next}$1 in F1{print}' file1 file2
1|A|B
1|C|D
3|G|H

답변3

이미 시도해 보셨나요 join?

$ tail -n +1 -- file1 file2
==> file1 <==
AT1G56430
AT3G55190
AT3G22880

==> file2 <==
AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

$ join -t'|' file1 file2
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

관련 정보