Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用唯一的列元素拆分大tsv文件并保留标题_Bash_Csv_Unix_Awk_Sed - Fatal编程技术网

Bash 如何使用唯一的列元素拆分大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

我有一个名为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         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输入文件
。非常感谢!这很快。你能解释一下你在这里做了些什么吗?当然-有什么特别的事情你不明白吗?我已经编辑了一些更详细的解释-希望现在已经清楚了。