Bash 如何使用唯一的列元素拆分大tsv文件并保留标题
我有一个名为myfile.tsv的tsv文件。我想使用Bash 如何使用唯一的列元素拆分大tsv文件并保留标题,bash,csv,unix,awk,sed,Bash,Csv,Unix,Awk,Sed,我有一个名为myfile.tsv的tsv文件。我想使用awk/gawk/bash或任何更快的命令行,根据chr列中的唯一元素拆分此文件,并获得chr1.tsv(header+row1)、chr2.tsv(header+rows2和3)、chrX.tsv(header+row4)、chrY.tsv(header+rows5和6)和chrM.tsv(header+last行) myfile.tsv chr value region chr1 223
awk/gawk/bash
或任何更快的命令行,根据chr列中的唯一元素拆分此文件,并获得chr1.tsv(header+row1)、chr2.tsv(header+rows2和3)、chrX.tsv(header+row4)、chrY.tsv(header+rows5和6)和chrM.tsv(header+last行)
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
这里有一个小脚本,可以满足您的需要:
NR == 1 {
header = $0
next
}
{
outfile = "chr" $1 ".tsv"
if (!seen[$1]++) {
print header > outfile
}
print > outfile
}
将保存第一行,以便以后使用。其他行将打印到与第一个字段的值匹配的文件中。如果尚未看到值,则会添加标题
NR
是记录编号,因此只有当记录编号为1(即第一行)时,NR==1
才为真。在该块中,整行$0
保存到变量标题中next
跳过任何其他块并移动到下一行。这意味着跳过第二个块(否则将在每个记录上无条件运行)
对于文件中的每一行,使用第一个字段的值生成输出文件名。看到的数组跟踪$1
的值<代码>!seen[$1]+
仅在第一次看到给定值$1
时为真,因为每次检查seen[$1]
的值都会递增。如果尚未看到$1
的值,则头将写入输出文件
每一行都会写入输出文件。这里有一个小脚本,它完成了您要查找的内容:
NR == 1 {
header = $0
next
}
{
outfile = "chr" $1 ".tsv"
if (!seen[$1]++) {
print header > outfile
}
print > outfile
}
将保存第一行,以便以后使用。其他行将打印到与第一个字段的值匹配的文件中。如果尚未看到值,则会添加标题
NR
是记录编号,因此只有当记录编号为1(即第一行)时,NR==1
才为真。在该块中,整行$0
保存到变量标题中next
跳过任何其他块并移动到下一行。这意味着跳过第二个块(否则将在每个记录上无条件运行)
对于文件中的每一行,使用第一个字段的值生成输出文件名。看到的数组跟踪$1
的值<代码>!seen[$1]+
仅在第一次看到给定值$1
时为真,因为每次检查seen[$1]
的值都会递增。如果尚未看到$1
的值,则头将写入输出文件
每一行都写入输出文件。这里有很多类似的问题。您尝试了什么?@fedorqui尝试了很多:对于$(seq 1 23)中的chr,do head-n1 myfile.tsv>chr$chr.tsv done
@fedorqui如何在unix中生成数字1到23以及X、Y和M的seq?这里有很多类似的问题。您尝试了什么?@fedorqui尝试了很多:对于$(seq 1 23)中的chr,do head-n1 myfile.tsv>chr$chr.tsv done
@fedorqui如何在unix中生成数字1到23以及X、Y和M的seq?@TomFenench谢谢,但输入文件在哪里?您将其作为参数传递给脚本,例如,awk-f script.awk输入文件
。非常感谢!这很快。请你解释一下你在这里做了什么好吗?当然-有什么特别的事情你不明白吗?我已经编辑了,添加了一些更详细的解释-希望现在已经清楚了。@TomFenench谢谢,但是输入文件在哪里?你把它作为参数传递给脚本,例如,awk-f script.awk输入文件
。非常感谢!这很快。你能解释一下你在这里做了些什么吗?当然-有什么特别的事情你不明白吗?我已经编辑了一些更详细的解释-希望现在已经清楚了。