将文件合并到一个数据框中

将文件合并到一个数据框中

我有近 160 个 txt 文件,每个文件有 7 列,现在我想将其放入一个文件中。每个文件的第一列和第六列数据(Geneid、长度)相同,所以我只想将其作为最终文件中的第一列和第二列,并从所有文件中提取第七列数据(sample1、sample2、sample3... ..) 并放入最终文件中。

例子:

样本1:

Geneid              Chr     Start   End Strand  Length  Sample1
ENSG00000223972.5   Chr1    34554   12227   ++  1735    0
ENSG00000227232.5   Chr2    14404   1450    ++  1351    12
ENSG00000278267.1   Chr3    17369   17436   ++   68     20
ENSG00000243485.4   Chr4    29554   3003    ++  1021    0
ENSG00000237613.2   Chr5    14404   35174   ++  1219    0

样本2:

Geneid              Chr    Start    End Strand  Length  Sample2
ENSG00000223972.5   Chr1    11869   1450    ++  1735    180
ENSG00000227232.5   Chr2    14404   17436   ++  1351    40
ENSG00000278267.1   Chr3    17369   17436   ++   68     9
ENSG00000243485.4   Chr4    14404   3003    ++  1021    49
ENSG00000237613.2   Chr5    17369   3003    ++  1219    3

样本3:

Geneid              Chr    Start    End Strand  Length  Sample3
ENSG00000223972.5   Chr1    17369   1450    ++  1735    11
ENSG00000227232.5   Chr2    29554   17436   ++  1351    156
ENSG00000278267.1   Chr3    34554   3003    ++  68      56
ENSG00000243485.4   Chr4    14404   3003    ++  1021    89
ENSG00000237613.2   Chr5    17369   35174   ++  1219    23

最终输出应该是

Geneid            Length    Sample1 Sample2 Sample3
ENSG00000223972.5   1735    0       180      11
ENSG00000227232.5   1351    12      40      156
ENSG00000278267.1   68      20      9       56
ENSG00000243485.4   1021    0       49      89
ENSG00000237613.2   1219    0       3       23

答案1

使用awkwith paste(对于修改后的问题)。

awk '{printf("%s\t%s", $1, $6); 
    for(i=7;i<=NF;i+=7) printf ("\t%s", $i); printf "\n"}' <(paste files) >final_file

附:printf根据您的字段实际值更改格式控制。

说明:

  • {printf ("%s\t%s" ,$1, $6)}首先打印第 1和第 6

  • for(i=7;i<=NF;i+=7) printf ("\t%s", $i);然后我们循环遍历其余字段并仅打印7列和模块为 7 的每个字段。

  • 首先,我们将所有内容粘贴files在一起,然后将其传递给awk.files意味着您可以提供paste多个文件名,myfiles*所有文件都以这些文件名开头,myfiles后跟任何内容。

相关内容