유전자 목록 파일이 있습니다. 이 같은
SWT21
SSA1
NRP1
EFB1
TFC3
MDM10
목록에 있는 유전자의 이름과 이에 대한 기타 기본 정보가 포함된 또 다른 파일이 있습니다. 두 번째 파일은 다음과 같습니다.
chrI 147593 151166 YAL001C - TFC3
chrI 143706 147531 YAL002W + VPS8
chrI 142173 143160 YAL003W + EFB1
chrI 140759 141407 YAL004W + YAL004W
chrI 139502 141431 YAL005C - SSA1
chrI 137697 138345 YAL007C - ERP2
chrI 136913 137510 YAL008W + FUN14
chrI 135853 136633 YAL009W + SPO7
chrI 134183 135665 YAL010C - MDM10
첫 번째 파일의 유전자 이름과 동일한 유전자 이름을 가진 두 번째 파일의 줄을 추출하고 싶습니다.
답변1
필요한 것은 간단합니다 grep
.
grep -Fwf gene_list.txt gene_info.txt
사용되는 옵션은 다음과 같습니다.
- -w : 전체 단어를 검색합니다. 이는 유전자 이름이
ERK1
유전자와 일치하지 않도록 보장합니다ERK12
(-w
표준 옵션은 아니지만 상당히 일반적임). - -f : 파일에서 검색할 패턴을 읽어옵니다. 이 경우에는
gene_list.txt
. - -F : 패턴을 정규식 대신 문자열로 처리합니다. 이렇게 하면 이와 같은 유전자 이름
TOR*
(그런 것이 존재하는 경우)이 일치하지 않게 됩니다TORRRRRR
.
참고: 이는 다음과 같이 가정합니다.공간 없음목록에서 유전자 이름을 둘러싸십시오. 있는 경우 먼저 제거해야 합니다(여기서 GNU 사용 sed
).
sed -i 's/ //g' gene_list.txt
답변2
예에서앗 위키:
awk 'FNR==NR {arr[$0];next} $6 in arr' gene_list info_list
Wiki 항목에서 복사된 설명:
FNR == NR
: 이 테스트는 레코드 수가 파일의 레코드 수와 같을 때 참입니다. 이는 첫 번째 파일에서만 작동하며, 두 번째 파일의 경우 NR은 file1 + FNR의 줄 수와 같습니다.arr[$0]
: 이는 전체 행을 기준으로 배열 요소 인덱스를 생성하는 고전적인 기술입니다. 그러면 file1 이름을 포함하는 배열이 생성됩니다.next
: 다음 레코드로 이동하므로 file1은 더 이상 처리되지 않습니다.$6 in arr
: $1이 arr, 즉 file1에 존재하면 기본 작업이 수행되고 해당 줄이 인쇄되기 때문에 이것은 file2의 레코드에서만 발생합니다.
답변3
더욱 견고하게 하려면 유전자 목록을 줄 끝에서 일치하는 정규식으로 변경할 수 있습니다. 이것은 작동해야 하며 POSIX와 호환됩니다.
sed 's/[[:space:]]*$/[[:space:]]*$/' gene_list | grep -wf - gene_info
gene_list
또는 (질문의 예에 따라) 앞에 공백을 추가하십시오.
sed 's/$/[[:space:]]*$/; s/[[:space:]]//' gene_list |
grep -wf - gene_info
물론, 유전자 이름에 정규식으로 해석되는 문자가 포함되어 있으면 작동하지 않습니다. 그러나 이 경우에는 sed
이를 이스케이프 처리하기 위해 추가 대체 표현식을 추가해야 합니다(예 s:\[:\[:
: .
답변4
egrep -wi "유전자 간 유도 파이프라인이 포함된 완전한 유전자 목록(1)" "파일 이름에 모든 유전자가 포함됨(2)"과 같은 명령을 제공하여 Linux에서 grep 명령을 사용할 수도 있습니다. 여기서 genelist(1)은 유전자 목록입니다(번호 20이고 gene(2))에는 전체 유전자 파일(번호 1000)이 포함되어 있습니다.