首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为txt文件中的每2行创建csv行

如何为txt文件中的每2行创建csv行
EN

Stack Overflow用户
提问于 2022-05-08 12:28:41
回答 9查看 187关注 0票数 4

我有一个这样的文本文件:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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

因为稍后我想像元组一样使用这个元组来查找压缩文件,读取它并得到一个最终文件,其名称如下:

代码语言:javascript
复制
Viruses/GCF_000837105.1/Tomato mottle virus.fna

我只需要学习如何做第一部分的问题。它可以通过下列方式:

  • sed
  • awk
  • R
  • Python

任何帮助都将不胜感激。这对我来说是很难做到的,因为原来的文件名非常混乱。

我试过这样做:

代码语言:javascript
复制
sed -z 's/\n/,/g;s/,$/\n/' multi_headers

但是,它在所有\n中都添加了逗号。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2022-05-08 12:40:12

在每个Unix框上的任何shell中使用任何awk,每次只在内存中存储1行,因此无论输入文件有多大,它都会工作:

代码语言:javascript
复制
$ 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是一个真正的条件,它导致执行打印当前记录的默认操作。

所以上面的脚本说:“如果当前行号是奇数,则在末尾用,打印它,否则在末尾用换行符打印它”,因此它用,将每一对行连接起来。

票数 5
EN

Stack Overflow用户

发布于 2022-05-08 12:39:53

Bash

您可以做一个paste (谢谢@glenn指出我以前对cat的无用使用)。

代码语言:javascript
复制
# 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 virus

R

R函数也是paste,以及sapply

代码语言:javascript
复制
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"   
票数 4
EN

Stack Overflow用户

发布于 2022-05-08 12:37:28

使用sed

代码语言:javascript
复制
$ 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并用逗号,替换它
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72160981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档