Use head
:
head -n1 -q *.txt > new-file
-
-n1
informahead
para extrair apenas a primeira linha. -
-q
diz para não imprimir o nome do arquivo.
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.
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. 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
.
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
Você tentou com awk
, aqui está uma awk
versão
awk 'FNR==1 {print} {nextfile}' *.txt > out
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.