약 320개의 행과 약 1800개의 열(1.9MB)이 있는 데이터 파일()이 있고 data.txt
(모든 행에 대해) 특정 열을 추출해야 합니다. 전체적인 레이아웃 data.txt
은 다음과 같습니다.
ID Adipocyte - breast, donor2.CNhs11969.11327-117E4 ....
HGNC:8888 0 ....
HGNC:9999 123.92 ....
HGNC:1000 9.31 ....
list.txt
추출해야 하는 열 목록(파일에)이 있지만 목록은 열 용어의 CNhsXXXXX 식별자로만 구성됩니다(예: 위 예의 경우 목록에는 다음 항목만 포함됩니다).CNhs11969, 전체 기간이 아님지방세포 - 유방, 기증자 2.CNhs11969.11327-117E4).
이전에 행 목록을 얻으려면 grep을 사용했지만 열 목록은 사용한 적이 없습니다. 둘러봤지만 여러 용어를 사용하여 여러 열을 파악하는 방법을 찾을 수 없습니다. 저는 유닉스를 처음 접했기 때문에(컴퓨팅 경험이 거의 없는 생물학자입니다) grep이 이 작업을 수행할 수 있는지 잘 모르겠습니다.
어떤 도움이라도 대단히 감사하겠습니다.
편집: 내 예제 출력은 ~1800개 열 중 ~850개 열입니다( list.txt
내 파일의 용어만 포함). 예: 내 목록에 CNhs5006 및 CNhs7021만 포함된 경우 헤더에 이러한 용어가 있는 열만 필요합니다. 예 data.txt
:
ID XXXCNhs5006XXX XXXCNhs6025XXX XXXCNhs7021XXX XXXCNhs8095XXX
HGNC:1111 1.23 1.53 9.21 0
HGNC:2222 1.95 73.92 0 123.29
원하는 출력의 예:
ID XXXCNhs5006XXX XXXCNhs7021
HGNC:1111 1.23 9.21
HGNC:2222 1.95 0
내 것은 list.txt
단순한 용어 목록입니다(열 1개, 행 ~850개, 행당 검색어 1개). 예:
CNhs1111 CNhs2222 CNhs3333 CNhs4444
답변1
OP는 다음을 수행할 수 있다고 생각합니다.
- 헤더 읽기
data.txt
및 열을 행으로 변환 Grep
일치하는 숫자 행을 가져옵니다.list.txt
data.txt
통과하다cut
열이 탭으로 구분된 경우 스크립트는 다음과 같습니다.
cut -f 1,$(
head -n1 data.txt |
tr '\t' '\n' |
grep -nf list.txt |
sed ':a;$!N;s/:[^\n]*\n/,/;ta;s/:.*//'
) data.txt
답변2
다음과 같이 시도해 볼 수 있습니다.
awk -F'\t' -f script.awk column.names data
어디 script.awk
:
NR == FNR { columns[NR] = $0; next }
NR > FNR && FNR == 1 {
for (i = 1; i <= NF; i++) {
for (j = 1; j < NR; j++) {
if ($i ~ columns[j]) {
selected[i] = 1;
break;
}
}
}
}
{
for (i = 1; i <= NF; i++) {
if (i in selected) printf $i "\t";
}
print "";
}
@Costas의 접근 방식은 독창적입니다. 그러나 조금 단순화할 수 있다고 생각합니다.
head -n1 data | tr '\t' '\n' | grep -nf column.names | cut -f1 -d: \
| paste -sd, | xargs -I{} cut -f {} data