2012-06-19 2 views
3

awk에서 해결하고자하는 다음과 같은 문제가 있습니다. 하나의 커다란 텍스트 테이블이 있습니다. 쉼표는 100k 행과 5k col로 구성됩니다. 첫 번째 행은 헤더이고 첫 번째 열은 레코드 ID입니다. 그런 다음 첫 번째 파일에 헤더의 하위 집합을 포함하는 두 번째 텍스트 파일이 있습니다. 두 번째 파일에 주어진 목록에 헤더가 들어있는 첫 번째 파일의 모든 열을 추출하고 싶습니다. 여기 입력의 일례와 목표 출력 :AWK는 두 번째 파일에서 선택한 헤더를 기반으로 파일에서 열을 추출합니다.

데이터 .txt

ID, head1, head2, head3, head4 
    1, 25.5, 1364.0, 22.5, 13.2 
    2, 10.1, 215.56, 1.15, 22.2 

List.txt 파일

head1 
head4 

원하는 출력 :

ID, head1, head4 
1, 25.5, 13.2 
2, 10.1, 22.2 

아무나 줘 수있는 awk에서 또는 유닉스 스크립팅을 통해이 문제를 해결하는 방법에 대한 조언? 어떤 도움을 주셔서 미리 감사드립니다!

+0

LIST.TXT 파일에 ID가 필요합니까? (솔루션을 포함시킬 수 있다면 솔루션을 단순화 할 것입니다.) 행운을 빕니다. (그것이 맞다면 질문을 편집하십시오.) – shellter

+0

@shellter 내 경우에는 솔루션이 지금은 더 간단합니다. –

+0

아니요, LIST.TXT에는 ID 필드가없고 그대로 제공됩니다. 출력의 ID는 DATA.TXT의 ID입니다. @Lev 귀하의 솔루션은 실제로 (분명히) 간단합니다. 일단 각 상징이 어디에 있는지 나는 이해한다! :) – lud

답변

2

내가 아이디어를 가지고,하지만 난 쉘 프로그래밍에 경험이 아니에요 (및 AWK를 모르는) 때문에 이것은 일부 바퀴를 개혁처럼 보인다 우스운 방법 :

$ cat DATA.TXT 
ID, head1, head2, head3, head4 
1, 25.5, 1364.0, 22.5, 13.2 
2, 10.1, 215.56, 1.15, 22.2 

$ cat LIST.TXT 
head1 
head4 

$ cols=($(sed '1!d;s/, /\n/g' DATA.TXT | grep -nf LIST.TXT | sed 's/:.*$//')) 

$ cut -d ',' -f 1$(printf ",%s" "${cols[@]}") DATA.TXT 
ID, head1, head4 
1, 25.5, 13.2 
2, 10.1, 22.2 

추신 bash 배열에 대한 아주 기본적인 아이디어를 thisthis 답으로 사용했습니다.

+0

완벽하게 작동합니다! 감사. 그리고 저는 그것에 대해 생각하고 당신이 한 것을 이해할 수있는 자료가 있습니다! – lud

+0

@lud 도와 줘서 기쁩니다. 내가 한 일을 이해하는 데 어려움이 있는지 물어보십시오. (힌트 : 'sed'1/d/s /,/\ n/g 'DATA.TXT' 등으로 시작하여 어떻게 처리되는지 살펴보십시오) –

4

은 csv 파일에서 특정 열 이름을 추출하는 데 사용할 수있는 유용한 awk 스크립트 here 있습니다.

다른 파일에서 열 이름을 읽을 수 있도록 약간 수정했습니다. 아래 스크립트를 dataExtractor.sh으로 저장하십시오.

#!/bin/bash 

DATAFILE=${1:-data.txt} 
COLUMNFILE=${2:-list.txt} 

awk -F, -v colsFile="$COLUMNFILE" ' 
    BEGIN { 
    j=1 
    while ((getline < colsFile) > 0) { 
     col[j++] = $1 
    } 
    n=j-1; 
    close(colsFile) 
    for (i=1; i<=n; i++) s[col[i]]=i 
    } 
    NR==1 { 
    for (f=1; f<=NF; f++) 
     if ($f in s) c[s[$f]]=f 
    next 
    } 
    { sep="" 
    for (f=1; f<=n; f++) { 
     printf("%c%s",sep,$c[f]) 
     sep=FS 
    } 
    print "" 
    } 
' "$DATAFILE" 

하면 실행 :

$ cat data.txt 
ID,head1,head2,head3,head4 
1,25.5,1364.0,22.5,13.2 
2,10.1,215.56,1.15,22.2 

$ cat list.txt 
ID 
head1 
head4 

$ dataExtractor.sh data.txt list.txt 
1,25.5,13.2 
2,10.1,22.2 
+0

답장을 보내 주셔서 감사합니다. 나는 더 작은 하나를 아래에 사용했다. 그러나 지금 나는 나의 awk 시도에서 내가 잘못 갔던 것을 안다! 굉장히 유용하다!! – lud

+0

ID, head1, head4도 출력에 표시하려면 어때요? ID 인 head1, head4가 출력 섹션에 표시됩니다. – Sakura

관련 문제