Como selecionar a primeira linha de cada arquivo em um diretório e imprimi-lo em um novo arquivo de texto

8

Eu tenho um diretório com vários arquivos .txt .

De cada um desses arquivos, quero selecionar a primeira linha e imprimi-la em um novo arquivo .txt (para obter uma lista de todas as primeiras linhas).

Eu tentei com os comandos awk e sed e os combinei com um loop, mas sem sucesso.

    
por Annemieke Smet 23.11.2015 / 14:52

5 respostas

14

Use head :

head -n1 -q *.txt > new-file
  • -n1 informa head para extrair apenas a primeira linha.
  • -q diz para não imprimir o nome do arquivo.
por choroba 23.11.2015 / 14:55
6

Usando grep :

grep -m 1 '.' *.txt >output.file

grep corresponderá a qualquer caractere e sairá após a primeira correspondência, ou seja, grep produzirá as primeiras linhas de todos os arquivos de entrada e nós os salvaremos em out.txt .

    
por heemayl 23.11.2015 / 15:42
2

Usando apenas Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txt é expandido para a lista de pastas / arquivos que terminam em .txt no diretório de trabalho atual (já que existem apenas pastas de arquivos que terminam com .txt não são uma preocupação);
  • <"$f" read line lê uma linha do caminho do arquivo armazenado em f e a armazena em line ;
  • printf "$line\n" >>new.txt : acrescenta o conteúdo de line a new.txt ;
% cat foo.txt 
line #1 in foo
line #2 in foo
line #3 in foo

% cat bar.txt
line #1 in bar
line #2 in bar
line #3 in bar

% for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done

% cat new.txt 
line #1 in bar
line #1 in foo
    
por kos 23.11.2015 / 15:09
0

Você tentou com awk , aqui está uma awk versão

awk 'FNR==1 {print} {nextfile}' *.txt > out
    
por A.B. 28.11.2015 / 21:15
0

Outra abordagem com o AWK é dizer ao AWK para imprimir, mas depois ir imediatamente para o próximo arquivo

tmp:$ touch file1 file2 file3

tmp:$ printf  "Line 1 \n Line 2" | tee file1 file2 file3
Line 1 
 Line 2
tmp:$ awk '{print;nextfile}' file1 file2 file3
Line 1 
Line 1 
Line 1

sed também permite a impressão de linhas específicas. Aqui eu combinei isso com find

tmp:$ find . -name "file*" -exec  sed -n '1p' {} \;                            
Line 1 
Line 1 
Line 1 

E perl:

tmp:$ find . -name "file*"  -exec perl -ne 'print  if 1..1' {} \;              
Line 1 
Line 1 
Line 1 

E por último, mas não menos importante, grep

tmp:$ grep -n 1 file1 file2 file3                                              
file1:1:Line 1 
file2:1:Line 1 
file3:1:Line 1 

Salvar tudo em um único arquivo é apenas uma questão de anexar > outputFile.txt no final desses comandos.

    
por Sergiy Kolodyazhnyy 29.11.2015 / 00:10