Concatenar tabela sem cabeçalho

3

Eu gostaria de concatenar várias tabelas e apenas manter o cabeçalho na primeira linha (e, portanto, não ter um novo cabeçalho toda vez que uma nova tabela for concatenada). Alguém sabe como fazer isso?

Atualmente estou usando:

find "/dir/folder" name "*.dat" -exec cat {} + >> "/dir/folder/table.txt"

mas eu posso me livrar do cabeçalho com isso.

    
por steve 03.08.2015 / 15:10

4 respostas

3

Com um BSD / GNU sed :

find "/dir/folder" -name "*.dat" -exec sed -se1d {} + >> "/dir/folder/table.txt"

... que instrui a tratar todos os arquivos de entrada separadamente, e para cada um deles d elete a linha 1 st.

Se o cabeçalho ainda não estiver no table.txt, você deve primeiro colocá-lo lá:

set -- /dir/folder/*.dat
head -n1 <"$1" >>/dir/folder/table.txt
find ...

Se todas as correspondências *.dat estiverem em diretórios filhos, isso não funcionará.

{   find /dir/folder -name \*.dat -exec \
         sh -c 'head -n1 "$0"; kill "$PPID"' {} \;
    find /dir/folder -name \*.dat -exec sed -se1d {} +
}   >>/dir/folder/table.txt

Isso deveria.

    
por 03.08.2015 / 15:23
2

Se o cabeçalho estiver em uma linha, com GNU tail :

find "/dir/folder" -name "*.dat" -exec tail -qn +2 {} +

POSIXly, você precisaria executar um tail por arquivo:

Para preservar o cabeçalho do primeiro arquivo, o GNUly:

find "/dir/folder" -name "*.dat" -print0 | {
   IFS= read -rd '' first &&
     cat "$first" &&
     xargs -r0 tail -qn +2
}
    
por 03.08.2015 / 15:26
1

Se todos os seus arquivos puderem caber em uma invocação awk :

find "/dir/folder" name "*.dat" -exec awk 'FNR == 1 && NR != 1 {next};1' {} + 
    
por 03.08.2015 / 15:31
0

tail permite ignorar o número de linhas:

find "/dir/folder" name "*.dat" -exec tail +2 {} + >> "/dir/folder/table.txt"
    
por 03.08.2015 / 15:27