
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 name
o (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 asociativabad
bajo la clave de las dos primeras columnas. Luego nos saltamos el resto de los comandos y saltamos para empezar de nuevo en lanext
línea.!(($1,$2) in bad)
Si las dos primeras columnas de la línea actual,
$1,$2
sonnoentre las claves debad
, luego imprima esta línea.