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

MAP*_*APK 1 unix csv bash 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 
Run Code Online (Sandbox Code Playgroud)

Tom*_*ech 5

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

NR == 1 {
    header = $0
    next
}

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

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


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

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

每一行都写入输出文件.