如何在unix中通过txt文件中的列名选择文件中的列

如何在unix中通过txt文件中的列名选择文件中的列

我有一个大约有 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

使用csvcutcsvformatfrom 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" }.

如果您希望输出在视觉上看起来是表格形式,您可以使用printfawk 中的 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

我使用多个空格、制表符和两者的组合分隔符进行了测试,并且每次都收到这些输出。

相关内容