ファイルを解析するためのawkコマンド

ファイルを解析するためのawkコマンド

次のテキストファイルがあります。最初の3行をお見せします。

chrom   st  end gene    strand  c1  c2  c3  c4  c5  c6  c7  c8  c9  c10 c11 c12 c13 c14
chr6    3345    3543    geneA   +   36  -23 -1  3   1250    946 416 458 475 417 58  80  2   14
chr9    1302    1389    geneB   -   8   -10 -18 -8  2896    2128    635 955 372 385 -20 31  -7  -7

最初の行はヘッダー行なので、そのまま印刷したいと思います。

次に、後続の行(つまり、行2から始まる)の最初の5つのフィールドをそのまま(チェーン情報まで)印刷し、その後、そのフィールドの値(フィールド6から始まる)が> = 100の場合、値を印刷します。 。現状のままフィールド値が<100の場合はNAに置き換えます。

したがって、私の出力ファイルは次のようになります(理想的にはタブで区切られています)。

chrom   st  end gene    strand  c1  c2  c3  c4  c5  c6  c7  c8  c9  c10 c11 c12 c13 c14
chr6    3345    3543    geneA   +   NA  NA  NA  NA  1250    946 416 458 475 417 NA  NA  NA  NA
chr9    1302    1389    geneB   -   NA  NA  NA  NA  2896    2128    635 955 372 385 NA  NA  NA  NA

ベストアンサー1

awk 'NR > 1 { for (i = 6; i <= NF; i++) if ($i < 100) $i = "NA" }; 1' yourfile.txt

拡張コメント:

NR > 1 {                         # skipping NR == 1, the first line
    for (i = 6; i <= NF; i++)    # column 6 to the end, skipping first 5
        if ($i < 100) $i = "NA"  # self-explanatory
}

1 # print all lines; 1 evaluates to true, and default action is print

編集:これを設定する方法はいくつかありますOFS。私が考えることができる最もきれいな方法は、OFS='\t'ファイル名を前に付けることです。

awk '...' OFS='\t' file.txt
awk -v OFS='\t' '...' file.txt
awk 'BEGIN { OFS="\t" }; ...' file.txt

おすすめ記事