Adicionando um caractere a todas as outras linhas de texto

4

Eu tenho um arquivo de texto enorme (cerca de 20G) que contém milhões de passagens (também com parágrafos) com cabeçalhos. Cabeçalhos e parágrafos são sempre uma linha cada, por exemplo,

Sunshine
This is a sunny day.
Darkness
A cave is a dark place.

O que eu tento criar é um comando de terminal que passa pelo texto e adiciona um '>' na frente de cada cabeçalho, isto é, toda linha de numeração ímpar (linhas 1, 3, 5,…), por exemplo,

>Sunshine
This is a sunny day.
>Darkness
A cave is a dark place.

Alguma idéia?

Se isso for relevante: o texto acima foi apenas um exemplo. A maioria dos cabeçalhos são MD5s, seguidos por uma sequência de DNA ('paragraph'), por exemplo,

0002ebd9ca12d6b69dfc3066356fc299
CATTAACCATTGGATACCTTCGGGTATATCCCATCCGTGTCTACATACTCTTGTTGCTTTGGCAGGCCGTGGTCACACACTGTGGGCTATGCCTGCATGTGCCTGCCAGAGGACCA

… que estou tentando converter em

>0002ebd9ca12d6b69dfc3066356fc299
CATTAACCATTGGATACCTTCGGGTATATCCCATCCGTGTCTACATACTCTTGTTGCTTTGGCAGGCCGTGGTCACACACTGTGGGCTATGCCTGCATGTGCCTGCCAGAGGACCA

    
por BSP 07.09.2014 / 17:38

7 respostas

3

Para editar todas as outras linhas (a.k.a. a cada segundo), começando com a primeira, com GNU sed , do

sed '1~2s/^/>/' your_file

Isso gravará o arquivo modificado na saída padrão. Ou seja, se você digitar apenas acima, o arquivo modificado será exibido na tela. Você pode colocar isso em um novo arquivo redirecionando a saída com > ; por exemplo,

sed '1~2s/^/>/' your_file > your_new_file

ou, se você quiser modificar seu arquivo existente, use -i :

sed -i '1~2s/^/>/' your_file
    
por 08.09.2014 / 19:56
2

POSIXly:

sed 's/^/>/;n' < file.in > file.out
    
por 28.06.2015 / 09:54
2

Outra resposta POSIX:

paste -d'>\n' /dev/null - - <infile

Obtém:

>Sunshine
This is a sunny day.
>Darkness
A cave is a dark place.
    
por 28.06.2015 / 10:37
0
sed '1,${s/^/>/g;n;n;n}' filename

Teste

cat filename
'Sunshine

'This is a sunny day.

'Darkness

'A cave is a dark place

'Sunshine

'This is a sunny day.

'Darkness

'A cave is a dark place

'Sunshine

'This is a sunny day.

'Darkness

'A cave is a dark place

Depois de executar o comando, recebo a saída como

sed '1,${s/^/>/g;n;n;n}' new
>'Sunshine

'This is a sunny day.

>'Darkness

'A cave is a dark place

>'Sunshine

'This is a sunny day.

>'Darkness

'A cave is a dark place

>'Sunshine

'This is a sunny day.

>'Darkness

'A cave is a dark place
    
por 07.09.2014 / 17:55
0

Com awk , você pode tentar algo como

awk 'NR % 4 == 1 {sub(/^/,">")} {print}' filename

Referências

link

    
por 07.09.2014 / 18:04
0

Sem linhas em branco entre cada linha e nenhum caractere ' no início:

$ awk '{print ((NR%2)? ">":"") $0}' passages.txt

dá:

>Sunshine
This is a sunny day.
>Darkness
A cave is a dark place.

Além disso, seguindo suas respostas a todas as respostas aqui, seu arquivo de entrada não é de linhas únicas com um caractere de Feed de linha no final ( \n ). Pode valer a pena verificar a sua fonte.

    
por 07.09.2014 / 18:03
0

Você pode usar o Vim no modo Ex:

ex -sc '%s/\v(.*\n){2}/> &/|x' file
  1. % seleciona todas as linhas

  2. s substituto

  3. \v ativa a mágica

  4. x salvar e fechar

por 18.04.2016 / 00:58