Como inserir uma linha do arquivo A acima da PRIMEIRA LINHA no arquivo B

2

Eu tenho essa pergunta constantemente, eu pesquisei na Internet, mas sem sucesso, então eu gostaria de pedir ajuda aqui.

Eu tenho um arquivo com aproximadamente 80.000.000 linhas. Meu trabalho é dividi-los em arquivos com 500.000 linhas cada. Bem, eu uso o código:

#split -l 500000 myfile segment

Pergunta 1: No entanto, tenho uma tarefa específica depois disso. No arquivo original, a primeira linha é a ID , e eu devo copiar essa linha em cada arquivo dividido no topo (para que cada arquivo dividido tenha essa linha de ID na primeira linha).

Eu tentei o código:

#sed -n 1,1p originalFile >> splitFile

Ele faz o trabalho de alguma forma, mas acrescenta a linha ID no final de cada arquivo dividido. Espero ter um código tal que coloque essa linha ID no topo (primeira linha) de cada arquivo dividido.

Pergunta 2 (incidentalmente). Eu tenho aprox. 170 arquivos divididos. É possível escrever um loop para anexar as linhas de ID no topo de cada arquivo dividido?

Eu gostaria de receber todos os conselhos!

    
por NeverBe 04.08.2016 / 17:59

5 respostas

1

Seu comando

$ sed -n "1,1p" originalFile >>splitFile

adicionará o ID ao final de splitFile , pois >> está instruindo o shell a anexar o fluxo ao arquivo. Também é muito lento, pois sed processará todas as linhas de 80M de originalFile antes de sair.

Após a divisão, você terá cerca de 160 arquivos com nomes xaa , xab , xac etc. Vamos adicionar o cabeçalho do arquivo original aos seguintes passos:

head -n 1 originalFile >id_line.txt

for f in x??; do
  cat id_line.txt "$f" >tmpfile && mv tmpfile "$f"
done

rm id_line.txt

O primeiro comando extrai a primeira linha de originalFile para seu próprio arquivo, id_line.txt .

O loop itera todos os arquivos gerados, supondo que você tenha usado split com o prefixo padrão etc. e concatena os arquivos id_line.txt e split em um arquivo temporário chamado tmpfile . Se isso correr bem, tmpfile substitui o arquivo dividido.

A última linha remove id_line.txt , que agora cumpriu sua finalidade.

    
por 04.08.2016 / 18:49
1

Fácil assim.

(head -n1 fileA.txt; cat fileB.txt) >result.tmp

O arquivo result.tmp será o FileB com a linha FileA acima de sua primeira linha.

Quando você vê as mudanças é como você quer mover result.tmp para fileB.txt.

Você não especifica na pergunta que linha de arquivoA deseja inserir no arquivo B, então estou assumindo que deseja a primeira linha.

    
por 04.08.2016 / 18:36
0

Tente pegar o conteúdo de splitFile com cat antes de sobrescrevê-lo.

echo -e "$(sed -n 1,1p originalFile)\n$(cat splitFile)" > splitFile

Isso é fácil de ler, mas pode se tornar caro com arquivos enormes.

    
por 04.08.2016 / 18:15
0

Supondo que todos os arquivos divididos tenham um nome semelhante, você pode usar. Nenhum loop necessário.

LINE_TO_INSERT=$(head -1 originalFile)
sed -i "1s/^/${LINE_TO_INSERT/\/\\}\n/" segment??
    
por 04.08.2016 / 18:14
0

Tente com sed

$ sed -i "1i$(sed -n 1p originalFile)" splitFile
  • 1i Insira o texto que segue na linha 1 do arquivo.
  • $(sed -n 1p originalFile) obtém a primeira linha do originalFile
por 05.08.2016 / 00:05