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

13

Eu tenho um diretório com vários .txtarquivos.

Em cada um desses arquivos, desejo selecionar a primeira linha e imprimi-la em um novo .txtarquivo (para obter uma lista de todas as primeiras linhas).

Eu tentei com o awke sedcomandos e isso combinado com um ciclo, mas sem sucesso.

Annemieke Smet
fonte
1
Como você é um usuário de reputação 6: Se alguma das respostas abaixo ajudou você, não se esqueça de clicar no cinza à esquerda do texto, o que significa Sim, esta resposta é válida ! ;-)
Fabby

Respostas:

21

Use head:

head -n1 -q *.txt > new-file
  • -n1diz headpara extrair apenas a primeira linha.
  • -q diz à cabeça para não imprimir o nome do arquivo.
choroba
fonte
9

Usando grep:

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

grepcorresponderá 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 estamos salvando-os out.txt.

heemail
fonte
1
Eu gosto disso, é um pequeno truque agradável.
Hashim
2

Usando apenas o 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 com .txtno diretório de trabalho atual (já que existem apenas pastas de arquivos que terminam com .txtnão são uma preocupação);
  • <"$f" read linelê uma linha do caminho do arquivo armazenado fe a armazena line;
  • printf "$line\n" >>new.txt: acrescenta o conteúdo de linea 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
kos
fonte
kos, um pouco longo, mas aqui é um ..
heemayl
@heemayl Mas é apenas Bash. ;)
kos
1
Entre
parênteses
1
@ heemayl Obrigado: D. Honestamente, eu estou verificando o site como um louco apenas por uma questão de proteger um XD questão
kos
0

Você já tentou awk, aqui está uma awkversão

awk 'FNR==1 {print} {nextfile}' *.txt > out
AB
fonte
0

Outra abordagem do AWK é dizer ao AWK para imprimir, mas depois vá 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

sedtambém permite a impressão de linhas específicas. Aqui eu combinei isso comfind

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 acrescentar > outputFile.txtno final desses comandos.

Sergiy Kolodyazhnyy
fonte