
두 개의 파일이 있습니다. 하나는 이름 목록(500개 항목)을 포함하고 다른 하나는 A.txt의 각 항목에 대한 추가 정보와 추가 항목을 포함합니다.
파일 A.txt(각 줄은 (fasta 형식) 으로 시작하고 >
공백, 숫자 및 특수 문자도 포함하지만 한 줄에 있음)
>xyz, B=123
>abc, B=231
>mnp, B=567
파일 B.txt(다음 줄에는 A.txt의 각 항목에 대한 특정 정보가 포함되어 있으며 파일 A보다 추가 항목이 있음)
>xyz, B=123
01010101010100101
>abc, B=231
1011110000011100000000
>mnp, B=567
10101
>opq, B=678
101010101010101001
>lmn, B=123
101010100000011
결과
>xyz, B=123
01010101010100101
>abc, B=231
1011110000011100000000
>mnp, B=567
10101
목록 B.txt에서 목록 A.txt의 항목을 grep하고 싶습니다.
감사해요
답변1
GNU 또는 FreeBSD grep을 사용하여 각 일치 항목에 대해 두 줄만 인쇄한다고 가정하면 A.txt
패턴 목록을 전달 grep
하고 일치 후 줄을 인쇄하도록 지시할 수 있습니다. 이렇게 하면 --
각 일치 항목 사이에 추가 줄이 생성되며, grep을 추가로 호출하여 쉽게 제거할 수 있습니다.
grep -A1 -Ff A.txt B.txt | grep -vx -- '--'
섹션당 줄 수가 고정되어 있지 않으면 awk를 사용할 수 있습니다. 먼저 찾고 있는 텍스트가 포함된 파일을 읽은 다음 B.txt
새 섹션을 시작하는 각 줄에 대해 섹션 헤더가 있는지 여부에 따라 인쇄를 시작하거나 중지합니다 A.txt
.
awk -v patterns_file=A.txt '
BEGIN {
while (getline <patterns_file) patterns_array[$0] = 1;
close(patterns_file);
}
/^/ { matching = $0 in patterns_array }
matching { print }
' B.txt