我有一个名为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
答案 0 :(得分:5)
这是一个可以满足您需求的小脚本:
NR == 1 {
header = $0
next
}
{
outfile = "chr" $1 ".tsv"
if (!seen[$1]++) {
print header > outfile
}
print > outfile
}
第一行已保存,因此可以在以后使用。其他行打印到与第一个字段的值匹配的文件。如果尚未看到该值,则添加标题。
NR
是记录号,因此NR == 1
仅在记录号为1(即第一行)时才为真。在此块中,整行$0
将保存到变量header
。 next
跳过任何其他块并移动到下一行。这意味着将跳过第二个块(否则将无条件地在每个记录上运行)。
对于文件中的每隔一行,输出文件名使用第一个字段的值构建。数组seen
会跟踪$1
的值。 !seen[$1]++
仅在第一次看到$1
的给定值时才为真,因为每次检查时seen[$1]
的值都会递增。如果尚未看到$1
的值,则标题将写入输出文件。
每一行都写入输出文件。