gpt4 book ai didi

perl - 从多个文件中剪切特定列并使用 unix 工具 reshape

转载 作者:行者123 更新时间:2023-11-29 09:12:28 25 4
gpt4 key购买 nike

我在一个文件夹中有数百个文件。这些文件中的每一个都是制表符分隔的文本文件,包含超过一百万行和 27 列。从每个文件中,我希望能够只提取特定的列(比如只提取列:1、2、11、12、13)。可以忽略第 3:10 和 14:27 列。我希望能够对文件夹中的所有文件(比如 2300 个文件)执行此操作。 2300 个文件中的每个列看起来像这样............

Sample.ID      SNP.Name    col3  col10  Sample.Index   Allele1...Forward       Allele2...Forward col14 ....col27      
1234567890_A rs758676 - - 1 T T - ....col27
1234567890_A rs3916934 - - 1 T T - ....col27
1234567890_A rs2711935 - - 1 T C - ....col27
1234567890_A rs17126880 - - 1 - - - ....col27
1234567890_A rs12831433 - - 1 T T - ....col27
1234567890_A rs12797197 - - 1 T C - ....col27

第二个文件中的剪切列可能看起来像这样......

Sample.ID      SNP.Name    col3  col10  Sample.Index   Allele1...Forward       Allele2...Forward col14 ....col27      
1234567899_C rs758676 - - 100 T A - ....col27
1234567899_C rs3916934 - - 100 T T - ....col27
1234567899_C rs2711935 - - 100 T C - ....col27
1234567899_C rs17126880 - - 100 C G - ....col27
1234567899_C rs12831433 - - 100 T T - ....col27
1234567899_C rs12797197 - - 100 T C - ....col27

从第 3 个文件中切出的列可能看起来像这样......

Sample.ID      SNP.Name    col3  col10  Sample.Index   Allele1...Forward       Allele2...Forward col14 ....col27      
1234567999_F rs758676 - - 256 A A - ....col27
1234567999_F rs3916934 - - 256 T T - ....col27
1234567999_F rs2711935 - - 256 T C - ....col27
1234567999_F rs17126880 - - 256 C G - ....col27
1234567999_F rs12831433 - - 256 T T - ....col27
1234567999_F rs12797197 - - 256 C C - ....col27

Sample.IDSample.Index 的宽度在每个文件中都相同,但可以在文件之间更改。 Sample.ID 的值在每个文件中相同,但在文件之间不同。每个切割文件在“SNP.Name”列下具有相同的值。 Sample.Index 列有时可能与不同文件相同。其他两列值 (Allele1...Forward & Allele2...Forward) 可能会更改,并在每个 SNP.Name 下用“” sep 粘贴到每个 示例.ID

我最终想将 2300 个文件中的所有剪切列合并(tab-delemited)成这种格式......

Sample.Index  Sample.ID     rs758676   rs3916934   rs2711935  rs17126880  rs12831433  rs12797197        
1 1234567890_A T T T T T C 0 0 T T T C
200 1234567899_C T A T T T C C G T T T C
256 1234567999_F A A T T T C C G T T C C

简单来说,我希望能够根据 Sample.ID 列将长格式转换为宽格式。这类似于 R 中的 reshape 函数。我在 R 中尝试了这个,但它耗尽了内存并且速度非常慢。任何人都可以帮助使用 unix 工具吗?

当 reshape.sh 应用于 20 个文件时...它在输出中产生了虚假的“样本行”。此处列出前 4 个字段。

Sample.Index    Sample.ID   rs476542    rs7073746   
1234567891_A 11 C C A G
1234567892_A 191 T C A G
1234567893_A 204 T C G G
1234567894_A 15 T C A G
1234567895_A 158 T T A A
1234567896_A 208 T C A A
1234567897_A 111 T T G G
1234567898_A 137 T C G G
1234567899_A 216 T C A G
1234567900_A 113 T C G G
1234567901_A 152 T C A G
1234567902_A 178 C C A A
1234567903_A 135 C C A A
1234567904_A 125 T C A A
1234567905_A 194 C C A A
1234567906_A 110 C C G G
1234567907_A 126 C C A A
Sample -
1234567908_A 169 C C G G
1234567909_A 173 C C G G
1234567910_A 168 T C A A

最佳答案

#!/bin/bash

awk '

BEGIN {
maxInd = length("Sample.Index")
maxID = length("Sample.ID")
}

FNR>11 && $2 ~ "^rs" {
SNP[$2]
key[$11,$1]
val[$2,$11,$1]=$12" "$13
maxInd = (len=length($11)) > maxInd ? len : maxInd
maxID = (len=length($1)) > maxID ? len : maxID
}

END {
printf("%-*s\t%*s\t", maxInd, "Sample.Index", maxID, "Sample.ID")
for (rs in SNP)
printf("%s\t", rs)
printf("\n")

for(pair in key) {
split(pair,a,SUBSEP)
printf("%-*s\t%*s\t", maxInd, a[1], maxID, a[2])
for(rs in SNP) {
ale = val[rs,a[1],a[2]]
out = ale == "- -" || ale == "" ? "0 0" : ale
printf("%*s\t", length(rs), out)
}
printf("\n")
}
}' DNA*.txt

概念验证

$ ./reshapeDNA
Sample.Index Sample.ID rs2711935 rs10829026 rs3924674 rs2635442 rs715350 rs17126880 rs7037313 rs11983370 rs6424572 rs7055953 rs758676 rs7167305 rs12831433 rs2147587 rs12797197 rs3916934 rs11002902
11 1234567890_A T T 0 0 C C 0 0 0 0 T C 0 0 C C T G 0 0 C C 0 0 T C A G T T T C G G
111 1234567892_A T T T C C C 0 0 0 0 C C T C C C T T 0 0 C C 0 0 T T A A T T T T G G
1 1234567894_A T T 0 0 T C C C A G C C 0 0 C C 0 0 T C C C T T T T A G T T C C G G
12 1234567893_A T T 0 0 C C T C A A T C 0 0 C C 0 0 T T C C T G T C A G T T T C G G
15 1234567891_A T T C C C C 0 0 0 0 C C C C C C T T 0 0 C C 0 0 T C A G T T T T G G

关于perl - 从多个文件中剪切特定列并使用 unix 工具 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5357148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com