将标题添加到列表文本文件awk中的列

时间:2017-04-27 12:53:22

标签: linux shell awk

我有一个包含数百列的非常大的文本文件。我想从包含列表的独立文本文件中为每列添加标题。

我的大文件如下:

largefile.txt
chrom start end 0 1 0 1 0 0 0 etc
chrom start end 0 0 0 0 1 1 1 etc
chrom start end 0 0 0 1 1 1 1 etc

我的标题列表:

headers.txt
h1
h2
h3

想要输出:

output.txt
                h1 h2 h3 h4 h5 h6 h7 etc..
chrom start end 0 1 0 1 0 0 0 etc
chrom start end 0 0 0 0 1 1 1 etc
chrom start end 0 0 0 1 1 1 1 etc

3 个答案:

答案 0 :(得分:1)

嗯,这是一个。 OFS是眼睛糖果的标签。从OP我得出结论,标题应该从第四个字段开始,因此代码中有+3个。

$ awk -v OFS="\t" '               # tab OFS
NR==FNR { a[NR]=$1; n=NR; next }  # has headers
FNR==1  {                         # print headers in the beginning of 2nd file
    $1=$1                         # rebuild record for tabs
    b=$0                          # buffer record
    $0=""                         # clear record
    for(i=1;i<=n;i++)             # spread head to fields
        $(i+3)=a[i]
    print $0 ORS b                # output head and buffered first record
}
{ $1=$1 }1' head data             # implicit print with record rebuild
                        h1      h2      h3
chrom   start   end     0       1       0       1       0       0       0       etc
chrom   start   end     0       0       0       0       1       1       1       etc
chrom   start   end     0       0       0       1       1       1       1       etc

然后,这也可以解决问题:

$ awk 'NR==FNR{h=h (NR==1?"":OFS) $0;next}FNR==1{print OFS OFS OFS h}1' head date
   h1 h2 h3
chrom start end 0 1 0 1 0 0 0 etc
chrom start end 0 0 0 0 1 1 1 etc
chrom start end 0 0 0 1 1 1 1 etc

答案 1 :(得分:1)

$ awk 'NR==FNR{h=h OFS $0; next} FNR==1{print OFS OFS h} 1' head large | column -s ' ' -t
                   h1  h2  h3
chrom  start  end  0   1   0   1  0  0  0  etc
chrom  start  end  0   0   0   0  1  1  1  etc
chrom  start  end  0   0   0   1  1  1  1  etc

或者如果您愿意:

$ awk -v OFS='\t' 'NR==FNR{h=h OFS $0; next} FNR==1{print OFS OFS h} {$1=$1}1' head large
                        h1      h2      h3
chrom   start   end     0       1       0       1       0       0       0       etc
chrom   start   end     0       0       0       0       1       1       1       etc
chrom   start   end     0       0       0       1       1       1       1       etc

答案 2 :(得分:0)

使用粘贴将标题转移到一行,然后将它们与主文件一起捕捉(-而不是文件名意味着stdin到cat):

$ paste -s -d' ' headers.txt | cat - largefile.txt

如果您确实需要在示例输出中排列标题,您可以预处理(手动或使用命令)头文件,或者您可以使用sed(仅一个选项)完成,如下所示:

$ paste -s -d' ' headers.txt | cat - largefile.txt | sed '1 s/^/                /'
                h1 h2 h3
chrom start end 0 1 0 1 0 0 0 etc
chrom start end 0 0 0 0 1 1 1 etc
chrom start end 0 0 0 1 1 1 1 etc