我的问题是:我有 200 个 fata 格式的文件。例如:
/User/Bin/bin.0.fa
/User/Bin/bin.1.fa
...
/User/Bin/bin.200.fa
每个 .fa 文件包含一个重叠群名称 ID 和分隔为的核苷酸字符:
In /User/Bin/bin.0.fa
>c_000000000001
CGACATTTTCCAACTTATTTTTTCCTGTAGTAAAAATTATTTACATACAAAAAAGGAGCTGTTCACTAATTATTTAGTGC
>c_000000000002
TACAACTCCTTTTTACTATTCTTCTGAATTTGATTTTTCATCCATTTGTTTTTGAGCTTCTTGAACTAATTTATCAAGACTATTATCTTCTACAACTTCATTTTCTTGTCTATCTAATTCATCTGTTAATGTTAATTGCTGATCTTTATCTTCTACATCT CTACCTGAAATTTTAGCTATAGCTACAATCTTTTCTTCATCAGAAGTTCTCATTAATCTAACTCCCATTGTAGCTCTAC
>c_000000000003
AGTTACAGATACATCTGATACATTAATTCTTATAGCAACACCACTTGTATTTATAAGCATTAATTCATCTTCAGATTTACATACTGTTGCACCAACAACTTTACCAGTCTTTTCACTGATTTTGTATGTTATTAAACCAACTCCACCTCTATTTTGTCTC
...
In /User/Bin/bin.1.fa
>c_000000000004
GGATCATCGCTTGTACATCCCAAACCAAAAAAGAATACTGCACTTACAATCAGTTGGATTTGAAACGCGATTTTCATTTTTGGTATATGTTTAAGATTAGCACTTTGTTTCATTGCTTTTGGCTATGAACGATGTTTACGGGGGTGTA
>c_000000000005
GAAAGAAGCGTATTGGTCGGTATAAATACCGCTCAACTAAACGAGCACAAAGCTACCGAAAATTTGGATGAATTGGCTTTTCTGGCCCAAACGGCTGGAGC
>c_000000000006
CGGCACTTATTTGCCCCAGCCCATTTTGGGGGTAGAAATACCCAAGAGCAAGGGAAAGGTTCGCCTTCTGGGTGTGCCTACCGTGGTTGACCGTATGTTGCAAC
...
...
In /User/Bin/bin.200.fa
>c_000000020120
CTCTGCAACTGGATCCCGAAAAGATCCGCAAAGAAAGCGAACCCAAAGAAAAAGTCGATCTGGAGAGCACCGTCGCCCGCAGTCTGGCCACCCT
>c_000000020121
CATCAATCATCTCAAATACTACCGCAACGCAGATTATTCCCAGTGCAATAACAAAACCGACTCCCGCCTCTTTTGTCTGGCCGTA
>c_000000050122
GGTACGCCTCCGGCAGAACAAGGCGGCAACGAACCTCAGAACGAGGGAAAGCTAACCCAGGCCGGGTACGCCTCCGGCAGAACAAGGCGGCAACGAACCTCAGAACGAGGGAAAGCTAACCCAGGCCG
...
我想将每个重叠群名称 ID(不带“>”)从特定 .fa 文件复制到单个制表符分隔的 txt 文件中,其中重叠群名称 ID 被命名为原始文件 n+1。像这样:
In /User/Bin/Summary.txt
c_000000000001 Bin_1
c_000000000002 Bin_1
c_000000000003 Bin_1
...
c_000000000004 Bin_2
c_000000000005 Bin_2
c_000000000006 Bin_2
...
...
c_000000020120 Bin_201
c_000000020121 Bin_201
c_000000020122 Bin_201
答案1
鉴于您发布的示例输入/输出以及您接受的答案,您实际需要的只是使用 GNU awk for ARGIND:
awk -F'>' -v OFS='\t' 'NF>1{print $2, "Bin_"ARGIND}' /Usr/Bin/bin*.fa > /User/Bin/Summary.txt
或使用任何 awk:
awk -F'>' -v OFS='\t' 'FNR==1{++c} NF>1{print $2, "Bin_"c}' /Usr/Bin/bin*.fa > /User/Bin/Summary.txt
答案2
#!/usr/bin/env python
import os
files = os.listdir('/User/Bin')
for file in files:
fi = open(file, 'r')
n = file.split('.')[1]
for line in fi:
line = line.strip()
if line.startswith('>'):
bins = 'Bin_' + n
print("%s\t%s" % (line[1:], bins))
fi.close()
只要您使用的是 Linux,您就可能安装了 python。这可能会起作用。
答案3
可以完成此操作的命令如下
grep "^>" /User/Bin/*.fa | awk -F ":>|\\." '{sub(".*/", "", $1);printf "%s\t%s_%d\n",$4,$1,$2+1}'
让我解释一下各个步骤
grep "^>" /User/Bin/*.fa
上面的命令仅 grep 具有所需模式的行,并随行打印文件名。我们本来可以只使用 awk 来打印匹配行,但通过使用 grep,我们可以更轻松地对文件名执行所需的操作。
awk -F ":>|\\."
这使得“:>”字符或“.”作为字段分隔符,从而将 grep 的输出分为 4 部分 - 1. 文件名直到第一个“.” 2. 索引名称 3. 扩展名 4. grep 的实际模式
{sub(".*/", "", $1)
上述步骤从第一部分的文件名中删除基本名称。
printf "%s\t%s.%d\n",$4,$1,$2+1}
根据需要进行最终打印,其中第二部分增加 1 ,并插入一个制表符以进行制表符分隔。
答案4
替代awk
grep
组合
grep -Eo "c_[0-9]+" *.fa | awk -F'[.:]' '{print $4,"Bin_"$2+1}' | column -t
或者
grep -Eo "c_[0-9]+" *.fa | awk -F'[.:]' 'BEGIN{OFS="\t"}{print $4,"Bin_"$2+1}'
或者如果它并不总是“bin...”
grep -Eo "c_[0-9]+" *.fa | awk -F'[.:]' 'BEGIN{OFS="\t"}{print $4,toupper(substr($1,1,1))substr($1,2)"_"$2+1}'
grep
请注意,如果只有 1 个输入文件,则此使用将会失败,在这种情况下您需要使用该-H
选项