タイトルに特定の文字列を含む列の抽出

タイトルに特定の文字列を含む列の抽出

キーワードを含む列のヘッダー(最初の行)を検索したいタブ区切りファイルがあります。その後、ファイルの残りの部分でのみその列を印刷したいと思います。

このサンプルファイルでは:

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

関連情報