Eu tenho vários arquivos com o mesmo cabeçalho e vetores diferentes abaixo disso. Preciso concatenar todos eles, mas quero que apenas o cabeçalho do primeiro arquivo seja concatenado e não quero que outros cabeçalhos sejam concatenados, pois são todos iguais.
por exemplo: file1.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
file2.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
D
E
F
Eu preciso que a saída seja
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
D
E
F
Eu poderia escrever um script em R, mas preciso dele com casca?
grep
(como na resposta do sputnik ).head -n 10 file1.txt >output.txt && tail -q -n +11 file*.txt >>output.txt
(se você tiver 10 linhas de cabeçalho). Além disso, se seus arquivos tiverem números em seus nomes, tenha cuidado com afile9.txt
classificação entrefile89.txt
efile90.txt
. Se os seus arquivos têm números gostofile001.txt
, ...,files009.txt
,files010.txt
, ..., entãofiles*.txt
vou enumerá-los na ordem correta.awk 'FNR==1 && NR!=1{next;}{print}' *.csv
Outra solução, semelhante a "
cat+grep
" de cima, usandotail
ehead
:Escreva o cabeçalho do primeiro arquivo na saída:
-
head -2
obtém 2 primeiras linhas do arquivo.Adicione o conteúdo de todos os arquivos:
-
-n +3
faztail
linhas de impressão do 3º ao final,-q
diz para não imprimir o cabeçalho com o nome do arquivo (lidoman
),>>
adiciona ao arquivo, não o substitui como>
.E com certeza você pode colocar os dois comandos em uma linha:
ou em vez de
;
colocar&&
entre eles para verificação de sucesso.fonte
(head -2 file1.txt ; tail -n +3 -q file*.txt ) > all.txt
ou(head -2 file1.txt && tail -n +3 -q file*.txt ) > all.txt
Tente fazer isso:
NOTA
-v
bandeira significa inverter a partida do grep^
no REGEX , significa início da string:
É uma técnica de corte de array bash .
fonte
<header>
linhas em qualquer lugar dos arquivos, não apenas no começo. Isso pode não ser um problema aqui, dependendo dos dados.grep '^<header>' file1.txt >output.txt && grep -v '^<header>' file*.txt >>output.txt
O
tail
comando (no GNU, pelo menos) tem uma opção para pular um determinado número de linhas iniciais. Para imprimir a partir da segunda linha, pular um cabeçalho de uma linha, faça:tail -n+2 myfile
Portanto, para manter o cabeçalho de duas linhas do primeiro arquivo, mas não o segundo, no Bash:
Ou, para muitos arquivos:
Se uma determinada string está presente em todas as linhas de cabeçalho, mas nunca no restante dos arquivos de entrada,
grep -v
é uma abordagem mais simples, como mostrou o sputnik.fonte
Mais curto (não necessariamente mais rápido) com
sed
:Isso excluirá todas as linhas que começam com
<header>...
a linha 3, para que o primeiro cabeçalho seja preservado e os outros cabeçalhos sejam removidos. Se houver um número diferente de linhas no cabeçalho, ajuste o comando de acordo (por exemplo, para cabeçalho de 6 linhas, use em7
vez de3
).Se o número de linhas no cabeçalho for desconhecido, você pode tentar o seguinte:
fonte
Supondo que você esteja usando uma pasta com arquivos .txt com o mesmo cabeçalho que precisa ser combinado / concatenado, esse código combinaria os arquivos txt em all.txt com apenas um cabeçalho. a primeira linha (linhas separadas por ponto e vírgula) reúne todos os arquivos de texto para concatenar, a segunda linha gera o cabeçalho do primeiro arquivo txt em all.txt e a última linha concatena todos os arquivos de texto reunidos sem o cabeçalho (iniciando o concatenação da linha 2 em diante) e anexa a all.txt .
fonte