약 500개의 유전자 이름이 있는 하나의 열만 genelist.txt
포함 data.txt
하는 두 개의 파일이 있지만 탭으로 구분된 파일에는 약 1000개의 열(샘플)과 약 30,000개의 행(유전자 이름)이 포함되어 있습니다. 전체 프로그램은 아래에 설명되어 있습니다.genelist.txt
data.txt
data.txt
Sample 1 Sample 2 Sample 3 Sample 4 Gene A 1.04 1.81 1.92 0.45 Gene B 1.11 1.12 1.32 0.92 Gene C 0.72 0.71 0.85 1.12 Gene D 1.19 1.42 0.13 0.32
data.txt
약 500개의 유전자 이름 각각에서 각 행(전체 행, 즉 모든 샘플)을 추출 genelist.txt
하고 이러한 행을 별도의 파일로 추출 해야 합니다 . grep이나 awk를 사용하라는 말을 듣고 이를 수행하는 방법을 조사했지만 코딩 경험이 거의 없는 단순한 생물학자로서 약간의 어려움을 겪고 있습니다. 누군가 이 작업이 어떻게 수행되는지 설명하고 시작하는 데 필요한 일부 코드를 제공할 수 있습니까?
추출이 의 전체 유전자 이름과 일치하는 용어만 반환한다면 좋을 것입니다 genelist.txt
. 예를 들어, 내가 가지고 있는 경우ABC123하지만ABC1234, genelist.txt
나는 단지 원한다ABC123추출된 것이 아니라 추출된 것ABC1234.
또한 이 작업을 수행한 후 genelist.txt
추출에 포함되지 않은 유전자를 어떻게 확인할 수 있나요? (즉, 일부 유전자의 이름이 잘못되었을 수 있으므로 돌아가서 대체 이름 및/또는 올바른 이름을 사용하여 다시 추출해야 합니다.)
답변1
data.txt
다음에 나열된 유전자에서 행을 추출하려면 genelist.txt
:
grep -w -F -f genelist.txt data.txt > newdata.txt
grep
사용된 옵션:
-w
전체 단어만 일치하도록 지시합니다grep
(즉,ABC123
어느 쪽도 일치하지 않습니다ABC1234
).-F
정규식 대신 고정 문자열(일반 텍스트) 검색-f genelist.txt
파일에서 검색 패턴 읽기
헤더 행도 필요한 경우(예 1, 예 2 등):
grep -w -F -f genelist.txt -e Sample data.txt > newdata.txt
-e Sample
"샘플"을 검색하실 수도 있습니다.
genelist.txt
존재하지 않는 행을 찾으려면 다음을 수행하십시오 newdata.txt
.
grep -v -w -F -f <(sed -E -e 's/(\t| +).*//' newdata.txt) genelist.txt
-v
검색을 반대로 하여 일치하지 않는 행을 인쇄합니다.
나머지 grep 옵션은 동일하지만 해당 옵션이 포함된 파일을 사용하는 대신 다음 -f
과 같은 파일을 사용합니다.프로세스 교체(바라보다반품), 이를 통해 실제 파일 대신 명령을 사용할 수 있습니다. 이 명령으로 생성된 모든 출력은 "파일"의 내용으로 간주됩니다.
sed -E -e 's/(\t| +).*//' newdata.txt
이 예에서는 첫 번째 TAB 문자 또는 표시되는 첫 번째 공백 쌍 내의 모든 항목을 먼저 제거한 후 newdata.txt의 각 줄을 출력하는 명령을 사용합니다 . 즉, 첫 번째 필드(예: "유전자 A")입니다. a) 데이터가 공백으로 구분되어 있는지 TAB으로 구분되어 있는지 확실하지 않고 b) 예제의 첫 번째 필드에 공백이 포함되어 있기 때문에 TAB 또는 이중 공백을 사용해야 합니다.
sed
사용된 옵션:
-E
(
확장된 정규 표현식을 사용하면 일반 , 및 를 사용할 수 있습니다. 이는)
, , 로 이스케이프 처리하는 것보다+
더 읽기 쉽습니다 .\
\(
\)
\+
-e 's/(\t| +).*//'
입력에 적용할 sed 스크립트(newdata.txt)를 지정합니다.
예제에서 이 명령을 실행하면 data.txt
다음과 같은 출력이 생성됩니다.
$ sed -E -e 's/(\t| +).*//' data.txt
Gene A
Gene B
Gene C
Gene D
그럼에도 불구하고 이 명령의 출력은 sed
이 명령의 검색 패턴 목록으로 사용됩니다 grep
.
답변2
귀하의 질문에 대한 실제 답변:
fgrep -w -f genelist.txt data.txt >results.txt
fgrep
정규 표현식이 아닌 고정 문자열 찾기(asgrep
및egrep
do)-w
fgrep
전체 단어를 일치시키라고 지시하므로ABC123
일치하지 않습니다 .ABC1234
-f genelist.txt
fgrep
에서 읽어올 검색 패턴을 알려줍니다genelist.txt
.
추출에 어떤 유전자가 genelist.txt
포함되지 않았는지 확인하는 것은 좀 더 복잡합니다. 한 가지 방법은 다음과 같습니다.
awk '{ print $1 }' results.txt | fgrep -w -v -f - genelist.txt >outsiders.txt
awk '{ print $1 }'
텍스트 파일의 첫 번째 열을 인쇄합니다. 이는 일치하는 유전자 목록입니다.fgrep
고정 문자열을 다시 일치시킵니다.-w
fgrep
전체 단어와 일치하도록 지시합니다 .-v
다음 줄을 인쇄하도록 지시아니요성냥-f -
패턴 목록stdin
, 즉 에서 일치하는 유전자 목록을 읽도록 지시합니다awk
.
sort -u
검색하기 전에 일치하는 유전자 목록에서 중복 항목을 중재하고 제거하여 awk
효율성을 향상시킬 수도 있습니다 fgrep
.
awk '{ print $1 }' results.txt | sort -u | fgrep -w -v -f - genelist.txt >outsiders.txt
답변3
이는 Linux 경험이 없는 사람에게는 어려운 작업입니다. 그러나 나는 당신에게 필요한 것이 무엇인지 이해하고 있으며 너무 어렵지 않아야 한다고 생각합니다. 미리 양해해 주시기 바랍니다. 이것은 매우 기본적인 설명을 넘어 매우 간결한 단기 집중 강좌입니다. 이해가 되지 않는 경우에는 기꺼이 자세히 설명하거나 필요에 따라 편집하겠습니다.
단지 구문 분석하여 .txt data.txt
로 이동하려는 경우 (newfile.txt는 언급한 다른 파일입니다. 이름은 임의입니다)genelist.txt
cat data.txt >> genelist.txt newfile.txt
특정 이름의 줄을 인쇄하려면 cat data.txt | grep ABCD123 >> genelist.txt newfile.txt
ABCD123을 사용하여 원하는 이름으로 변경할 수 있습니다.
이 명령은 grep을 사용하여 찾은 행만 출력합니다("검색" 기능과 유사하지만 행별로만 검색합니다.)
"|"는 파이프라고 하며 "grep" 명령과 함께 사용하면 찾고 있는 것을 필터링하는 필터와 같은 역할을 합니다. ( cat zoofile.txt | grep pandas
예를 들어, 파일 이름이 "zoofile"인 "pandas"라는 단어가 포함된 모든 줄을 찾습니다. Linux는 대소문자를 구분하며 입력한 내용만 정확하게 찾습니다. "panda, pandas, panderoons" 또는 제공하기 위해 pand*를 사용할 수 있습니다. 여기서 *는 와일드카드이고 길이는 0에서 255비트 사이의 문자일 수 있습니다. 이렇게 하면 pand에서 pandzzzzzzzzzz 및 숫자를 포함하여 그 사이의 모든 문자가 선택됩니다.
좀 더 이국적인 열 구문 분석을 위해 awk를 사용할 수 있지만(내가 가장 좋아하는 도구 중 하나입니다!) 일부 매개변수를 기반으로 한 열 중 하나에 대한 데이터만 필요하지 않으면 여기에 적합하지 않은 것 같습니다.
마지막으로, 이곳은 몇 가지 명령줄 지식을 배울 수 있는 좋은 장소입니다. 이는 grep에는 도움이 될 수 있지만 awk에는 도움이 되지 않습니다.
https://www.codecademy.com/learn/learn-the-command-line
나중에 awk에 대해 더 자세히 다룰 것입니다. awk에는 매우 광범위한 강좌가 많이 있지만 그 강좌에서 길을 잃기 쉽습니다. 이것은 당신이 하고 싶은 일을 더 많이 보여주는 실용적인 웹사이트입니다.
https://www.ibm.com/developerworks/library/l-awk1/
편집 - 다시 읽은 후에 뭔가를 놓쳤을 수 있습니다. 두 파일을 비교하고 다른 파일과 일치하는 파일의 내용만 인쇄하시겠습니까? 제안 사항과 예시를 제공해 주시면 그에 따라 답변을 수정해 드리겠습니다.