我有一个大约有 1000 列的大文件。前两列是染色体和SNP(单核苷酸多态性)位置,其余是样本。这是前几行:
#CHROM POS P0431 P432 P433 P434 P435
Chr01 180349 G G G N G
Chr01 180372 N N N N A
Chr01 180389 A N A N N
该数据集中有来自 3 个不同组的样本,我想将其分开并存储在单独的文件中。
这是一个文件,我有足够的 group1 ID。
$ head group1
P0431
P434
P435
因此,我想在我的主数据中找到这些样本并将它们存储为 group1.data。
$ head group1.data
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
答案1
使用csvcut
和csvformat
from csvkit
,并假设(可能是多个)空格作为输入分隔符:
$ csvcut -d' ' -S -c "#CHROM,POS,$(paste -sd, < group1)" group1.data | csvformat -T
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
答案2
$ cat tst.awk
NR==FNR {
groups[++numGroups] = $1
next
}
FNR==1 {
for (i=1; i<=NF; i++) {
f[$i] = i
}
}
{
printf "%s%s%s%s", $1, OFS, $2, OFS
for (groupNr=1; groupNr<=numGroups; groupNr++) {
group = groups[groupNr]
printf "%s%s", $(f[group]), (groupNr<numGroups ? OFS : ORS)
}
}
$ awk -f tst.awk group1 file
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
如果您希望输出以制表符分隔而不是以空格分隔,请在脚本顶部添加一行,显示BEGIN { OFS="\t" }
.
如果您希望输出在视觉上看起来是表格形式,您可以使用printf
awk 中的 s 或通过管道将上面的内容传递到column
:
$ awk -f tst.awk group1 file | column -t
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
答案3
你可以这样做awk
:
awk 'NR==1,NR==4 {print $1,$2,$3,$6,$7}' group1 > group1.data
这将只打印前四行的字段 1、2、3、6 和 7,并给出您请求的输出并将其附加到文件中group1.data
:
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
如果你想让它看起来更干净,那么你可以使用OFS='\t'
将分隔符设置为制表符:
awk 'NR==1,NR==4 {print $1,$2,$3,$4,$5}' OFS='\t' group1 > group1.data
输出:
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N
我使用多个空格、制表符和两者的组合分隔符进行了测试,并且每次都收到这些输出。