我有一个这样的文本文件:
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz
Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz
Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz
Tomato mottle virus我需要一个像这样的csv文件:
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus因为稍后我想像元组一样使用这个元组来查找压缩文件,读取它并得到一个最终文件,其名称如下:
Viruses/GCF_000837105.1/Tomato mottle virus.fna我只需要学习如何做第一部分的问题。它可以通过下列方式:
任何帮助都将不胜感激。这对我来说是很难做到的,因为原来的文件名非常混乱。
我试过这样做:
sed -z 's/\n/,/g;s/,$/\n/' multi_headers但是,它在所有\n中都添加了逗号。
发布于 2022-05-08 12:40:12
在每个Unix框上的任何shell中使用任何awk,每次只在内存中存储1行,因此无论输入文件有多大,它都会工作:
$ awk '{ORS=(NR%2 ? "," : RS)} 1' file
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus在上面的少量代码中发生了很多事情,下面是一个解释:
ORS是内置变量,包含要在每个输出记录末尾打印的字符串(在本例中为record = line ),默认情况下是换行符。RS是内置变量,包含分隔每个输入记录的字符串(或regexp),默认情况下是换行符。NR是包含当前记录/行号的内置变量,因此NR%2是奇数记录的1,而偶数为0。NR%2 ? "," : RS是一个三元表达式,为奇数行生成,,对于偶数行,\n (或其他设置RS的东西,例如\r\n)。1是一个真正的条件,它导致执行打印当前记录的默认操作。所以上面的脚本说:“如果当前行号是奇数,则在末尾用,打印它,否则在末尾用换行符打印它”,因此它用,将每一对行连接起来。
发布于 2022-05-08 12:39:53
Bash
您可以做一个paste (谢谢@glenn指出我以前对cat的无用使用)。
# or cat mytext.txt | paste -d "," - -
paste -d "," - - < mytext.txt
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virusR
R函数也是paste,以及sapply
mytext <- scan("mytext.txt", character(), sep = "\n")
sapply(seq(1, length(mytext), 2), function(x) paste(mytext[x], mytext[x + 1], sep = ","))
[1] "Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A"
[2] "Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA"
[3] "Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus" 发布于 2022-05-08 12:37:28
使用sed
$ sed '/^Viruses/{N;s/\n\(.*\)/,\1/}' multi_headers
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus/^Viruses/ -从字符串Viruses开始的匹配行{N; -在模式空间中读取/追加下一行输入。s/\n\(.*\)/,\1/ -从模式空间中删除\n并用逗号,替换它https://stackoverflow.com/questions/72160981
复制相似问题