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)
这是一个小脚本,可以满足您的需求:
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
尚未看到值,则将标头写入输出文件.
每一行都写入输出文件.