Cómo seleccionar la primera línea de cada archivo en un directorio e imprimirlo en un nuevo archivo de texto

13

Tengo un directorio con varios .txtarchivos.

De cada uno de estos archivos, quiero seleccionar la primera línea e imprimirlo en un nuevo .txtarchivo (para obtener una lista de todas las primeras líneas).

Lo he probado con el awky sedlos comandos y la combiné con un bucle, pero sin éxito.

Annemieke Smet
fuente
1
Como eres un usuario de reputación 6: si alguna de las respuestas a continuación te ayudó, no olvides hacer clic en el gris a la izquierda de su texto, lo que significa que sí, ¡esta respuesta es válida ! ;-)
Fabby

Respuestas:

21

Uso head:

head -n1 -q *.txt > new-file
  • -n1le dice headque extraiga solo la primera línea.
  • -q le dice a la cabeza que no imprima el nombre del archivo.
choroba
fuente
9

Utilizando grep:

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

grepcoincidirá con cualquier carácter y saldrá después de la primera coincidencia, es decir, grepmostrará las primeras líneas de todos los archivos de entrada y los guardaremos out.txt.

heemayl
fuente
1
Me gusta esto, es un bonito truco.
Hashim
2

Usando solo Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtse expande a la lista de carpetas / archivos que terminan .txten el directorio de trabajo actual (ya que solo hay carpetas de archivos que terminan .txtno son una preocupación);
  • <"$f" read linelee una línea de la ruta del archivo almacenada fy la almacena line;
  • printf "$line\n" >>new.txt: añade el contenido 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
fuente
kos, un poco largo pero aquí es +1 ..
heemayl
@heemayl Pero es solo Bash. ;)
kos
1
Por cierto felicidades por 15k :)
heemayl
1
@heemayl Gracias: D. Sinceramente, estoy visitando el sitio como loco solo por proteger una pregunta XD
kos
0

Lo has probado awk, aquí hay una awkversión

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

Otro enfoque con AWK es decirle a AWK que imprima, pero luego vaya inmediatamente al siguiente archivo

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

sedTambién permite la impresión de líneas específicas. Aquí he combinado eso confind

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

Y perl:

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

Y por último pero no menos importante , grep

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

Guardar todo en un solo archivo es solo cuestión de agregarlo > outputFile.txtal final de estos comandos.

Sergiy Kolodyazhnyy
fuente