제목에 특정 문자열이 포함된 열 추출

제목에 특정 문자열이 포함된 열 추출

키워드가 포함된 열의 헤더(첫 번째 행)를 검색하려는 탭으로 구분된 파일이 있습니다. 그런 다음 파일의 나머지 부분에서만 해당 열을 인쇄하고 싶습니다.

이 예제 파일에서:

sample  AAA BBB sample_CCC  DDD EEE sample_FFF
000 aaa bbb ccc ddd eee fff

나는 다음과 같은 것을 얻고 싶습니다 :

sample  sample_CCC  sample_FFF
000 ccc fff

나는 시도했다:

awk -F"\t" '{for(i=1;i<=NF;i++){if ($i ~ /sample/){print $i}}}' filename > outputfile

그러나 이는 해당 문자열(sample)을 포함하는 열(sample_CCC, Sample_FFF)이 아닌 정확한 문자열(sample)이 있는 열만 추출합니다.

문자열과 정확히 일치하지 않지만 이를 포함하는 열을 추출하도록 이 코드를 변경하는 방법이 있습니까?

답변1

Perl은 깔끔한 솔루션을 제공합니다.

perl -ale '
    @cols = grep {$F[$_] =~ /sample/} 0..$#F if $. == 1;
    print "@F[@cols]";
' file

답변2

이런 일이 있으면 어떻게 해야 할까요?

NR==1   {
        for (i=1; i<=NF; i++) {
                if ($i ~ /sample/) {
                        head[i]= $i
                        printf "%s\t", $i
                }
        }
        printf "\n"
}

NR>1    {
        for (i=1; i<=NF; i++) {
                if (head[i]) {
                        printf "%s\t", $i
                }
        }
        printf "\n"
}

이는 다소 순진한 접근 방식이지만 작은 파일에는 작동합니다.

답변3

$ awk '
    BEGIN { FS=OFS="\t" }
    NR==1 {
        for (inFldNr=1; inFldNr<=NF; inFldNr++) {
            if ($inFldNr ~ /sample/) {
                out2inFldNr[++numOutFlds] = inFldNr
            }
        }
    }
    {
        for (outFldNr=1; outFldNr<=numOutFlds; outFldNr++) {
            inFldNr = out2inFldNr[outFldNr]
            printf "%s%s", $inFldNr, (outFldNr<numOutFlds ? OFS : ORS)
        }
    }
' file
sample  sample_CCC      sample_FFF
000     ccc     fff

관련 정보