Use head :
head -n1 -q *.txt > new-file
-
-n1informaheadpara extrair apenas a primeira linha. -
-qdiz 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.