No puedo usar el bucle while porque está tomando tiempo. ¿Existe alguna forma más rápida de obtener el archivo final? En Linux

No puedo usar el bucle while porque está tomando tiempo. ¿Existe alguna forma más rápida de obtener el archivo final? En Linux
cat file_1.txt

100 200 name

100 200

100 200

150 300

150 300

150 250

150 250

150 300 name


final file should be 

150 300

150 300

150 250

150 250

Estoy usando este comando

cat file_1.txt | grep -v "name">file_2.txt; cat file_2.txt| while read line;do cat file_1.txt| grep "$line"| head -1|grep -v "name" ;done

pero hay demasiados datos que no se pueden usar en el bucle while, está llevando mucho tiempo el uso del bucle while. ¿Hay alguna otra forma de hacerlo rápido como usar "grep -vf file_1 file_2"algo así pasando así? por favor hágamelo saber.

Aquí estoy usando la lógica de obtener la línea superior del patrón encontrado. El patrón es cada línea de"file_1.txt"

Respuesta1

Me parece que su código imprime cada línea de file_1.txt a menos que (a) la línea contenga nameo (b) las dos primeras columnas de la línea sean las mismas que una línea anterior que contenía name. En ese caso, intente:

$ awk '/name/{bad[$1,$2];next} !(($1,$2) in bad)' file_1.txt 
150 300
150 300
150 250
150 250

Cómo funciona

  • /name/{bad[$1,$2];next}

    Si la línea actual contiene name, agregamos una entrada a la matriz asociativa badbajo la clave de las dos primeras columnas. Luego nos saltamos el resto de los comandos y saltamos para empezar de nuevo en la nextlínea.

  • !(($1,$2) in bad)

    Si las dos primeras columnas de la línea actual, $1,$2sonnoentre las claves de bad, luego imprima esta línea.

información relacionada