Use o comando find para extrair linhas de arquivos de texto na subpasta

3

Eu tenho o arquivo de texto input.txt em cada uma das centenas de subpastas chamadas sample_1, ..., sample_100 .

Eu posso extrair a primeira linha de todos os arquivos input.txt usando o comando abaixo:

find -name input.txt -exec awk 'FNR == 1 {print $0}' > out.txt {} \;

Mas isso imprime a primeira linha de todo o arquivo input.txt para um out.txt no diretório atual.

O que eu quero é out.txt em cada subpasta com a primeira linha de input.txt nessa subpasta específica. Por exemplo, a subpasta out.txt inside sample_57 terá a primeira linha de input.txt em sample_57 .

Qualquer ideia de como fazer isso.

    
por flappingwings 19.10.2017 / 15:44

3 respostas

4

Apenas faça

find . -type f -name "input.txt" -execdir awk 'NR==1{print $0>"out.txt"}' '{}' +

Ou você pode usar o exit handler, que sairá depois da primeira linha de impressão e melhor quando você quiser imprimir a primeira linha e não for necessário awk para processar o arquivo inteiro até o fim.

find . -type f -execdir awk '{print $0>"out.txt";exit}' '{}' +
    
por 19.10.2017 / 15:51
7

Use head em vez de awk . Além disso, use -execdir em vez de -exec para facilitar a leitura do comando.

find -type f -name input.txt -execdir sh -c 'head -1 input.txt > out.txt' \;
    
por 19.10.2017 / 16:21
5

out.txt in each subfolder with first line of input.txt in that particular subfolder

Solução

find + sed :

find . -type f -name input.txt -exec sh -c 'out_fn="${1%/*}/out.txt"; sed -n "1p" "{}" > "$out_fn"' _ {} \;
  • out_fn="${1%/*}/out.txt" - caminho para nome do arquivo de saída no formato /path/to/subfolder/out.txt

  • sed -n "1p" "{}" - extrai a primeira linha do arquivo de entrada {}

por 19.10.2017 / 16:02

Tags