我有近 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
使用awk
with 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
后跟任何内容。