Usando find e sed para copiar a 20ª linha de muitos arquivos em um arquivo

2

Eu tenho uma pasta chamada PKA1

Dentro desta pasta eu tenho várias pastas nomeadas como:

1eV , 2eV .... 30eV

Dentro de cada uma dessas subpastas eu tenho um arquivo chamado PKA.dump

Eu quero copiar a 20ª linha de PKA.dump em cada subpasta para um arquivo chamado data.txt .

Eu sei que posso usar o comando find para encontrar todos os arquivos PKA.dump como:

find . -type f -name PKA.dump

Eu também sei que posso escrever individualmente com sed :

sed -i '20q;d' PKA.dump > data.txt

Mas quando tento percorrer todos os arquivos e usar sed como:

find . -type f -name PKA.dump | sed -i '20q;d' PKA.dump > data.txt

Eu recebo este erro:

sed: can't read PKA.dump: No such file or directory

Qualquer ajuda? Eu só quero sequencialmente ter a linha 20 de PKA.dump no arquivo 1eV , 2eV , 3eV etc em um arquivo chamado data.txt .

    
por Jackson Hart 03.04.2015 / 22:52

1 resposta

3

find . -name PKA.dump -type f -exec awk '
   FNR == 20 {print; nextfile}' {} +

nextfile , quando disponível (GNU awk e alguns outros como o FreeBSD e versões recentes de mawk e que em breve serão adicionado ao padrão irá pular para o próximo arquivo. Onde não, ele será ignorado (é como desreferenciar uma variável nextfile ); ainda funcionará, mas leia os arquivos totalmente.

Você ainda pode fazer:

find . -name PKA.dump -type f -exec sed '20q;d' {} \;

Mas isso significa executar um comando sed por arquivo, o que seria menos eficiente.

    
por 03.04.2015 / 23:05