如何使用唯一列元素拆分大tsv文件并保留标头

时间:2016-01-18 11:59:09

标签: bash csv unix awk sed

我有一个名为myfile.tsv的tsv文件。我想基于chr列中的唯一元素使用awk/gawk/bash或任何更快的命令行拆分此文件,并获取chr1.tsv(header + row1),chr2.tsv(header + rows2和3),chrX.tsv( header + row4),chrY.tsv(header + rows5and6)和chrM.tsv(header + last row)。

myfile.tsv

   chr    value       region
  chr1      223         554
  chr2      433         444 
  chr2      443         454 
  chrX      445         444 
  chrY      445         443    
  chrY      435         243
  chrM      543         544 

1 个答案:

答案 0 :(得分:5)

这是一个可以满足您需求的小脚本:

NR == 1 {
    header = $0
    next
}

{
    outfile = "chr" $1 ".tsv"
    if (!seen[$1]++) {
        print header > outfile
    }
    print > outfile
}

第一行已保存,因此可以在以后使用。其他行打印到与第一个字段的值匹配的文件。如果尚未看到该值,则添加标题。

NR是记录号,因此NR == 1仅在记录号为1(即第一行)时才为真。在此块中,整行$0将保存到变量headernext跳过任何其他块并移动到下一行。这意味着将跳过第二个块(否则将无条件地在每个记录上运行)。

对于文件中的每隔一行,输出文件名使用第一个字段的值构建。数组seen会跟踪$1的值。 !seen[$1]++仅在第一次看到$1的给定值时才为真,因为每次检查时seen[$1]的值都会递增。如果尚未看到$1的值,则标题将写入输出文件。

每一行都写入输出文件。