Как заменить запятую перед определенной строкой на \ n в CSV-файле - PullRequest
0 голосов
/ 06 января 2019

У меня есть файл csv, и я хочу заменить запятую на \n после GCA_*.

Введите:

ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1,ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio,ASM330895v1,Escherichia coli (E. coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio 

Желаемый выход:

ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1
ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio
ASM330895v1,Escherichia coli (E. coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio 

Моя попытка:

sed 's/ASM*/\n&/' ordered_lines_per_genome.csv > assembly_report_table.csv

Ответы [ 5 ]

0 голосов
/ 07 января 2019

Использование Perl и предположения, что идентификатор начинается с ASM ..

$ cat maryem.txt
ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1,ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio,ASM330895v1,Escherichia coli (E. coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio
$ perl -pe ' s/([^^]ASM.+?,)/\n$1/g; s/^,//mg; ' maryem.txt
ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1
ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio
ASM330895v1,Escherichia coli (E. coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio
$
0 голосов
/ 06 января 2019

awk решение:

$ awk -F, '{i=0;while((++i)<=NF)printf $i ((!(i%16) || i==NF)? ORS : ",")}' mb.csv
ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1
ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio
ASM330895v1,Escherichia coli (E. coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio 

Это похоже на ответ Микпа , 16 полей в виде строки.
Если вы уверены, что входной файл имеет только одну строку, вы можете удалить первые i=0;.

Если 'ASM' относительно уникален, можете использовать свой собственный путь (ASM в качестве начала строки):

awk '{print gensub(",ASM","\nASM","g")}' mb.csv

То есть:

awk '{print gensub(",ASM","\nASM","g")}' ordered_lines_per_genome.csv > assembly_report_table.csv

для вас.

0 голосов
/ 06 января 2019

Этот простой GNU sed может быть тем, что вы ищете:

$ sed 's/,/\n/16;P;D' file
ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1
ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio
ASM330895v1,Escherichia coli (E.coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio
  • s/,/\n/16: заменяет 16-ую запятую , новой строкой \n
  • P: печатает строку до первой новой строки \n
  • D: удаляет напечатанный текст и снова начинает цикл с оставшимся текстом

Он основан на великолепном ответе от @potong.

0 голосов
/ 06 января 2019

Вы должны удалить * и добавить g для глобального:

sed 's/ASM/\n&/g' ordered_lines_per_genome.csv > assembly_report_table.csv

Если вам не нужна запятая, вы можете использовать

sed 's/,ASM/\nASM/g' ordered_lines_per_genome.csv > assembly_report_table.csv

Для удовольствия, с awk:

awk 'BEGIN {RS="ASM"} NF {print "ASM" $0}' ordered_lines_per_genome.csv

Если вам не нужна запятая в конце строки, вы можете использовать

awk 'BEGIN {RS="[,]*ASM"} NF {print "ASM" $0}' ordered_lines_per_genome.csv
0 голосов
/ 06 января 2019

С GNU sed:

sed 's/\(GCA_[^,]*\),/\1\n/g' input.csv
  • \(GCA_[^,]*\),: соответствует GCA*, за которыми следует запятая. \(...\) определяет группу, которую мы позже можем использовать в строке замены.
  • Замена \1\n: вставка группы ("GCA *") из матча и добавление новой строки.

Чтобы изменить файл напрямую:

sed -i 's/\(GCA_[^,]*\),/\1\n/g' input.csv

Или исправить командную строку из комментария:

sed 's/ASM[^,]*/\n&/g' input.csv

Или лучше: для предотвращения запятой:

sed 's/,\(ASM[^,]*\)/\n\1/g' input.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...