¿Cómo se elimina una entrada completa que contiene un patrón?

¿Cómo se elimina una entrada completa que contiene un patrón?

Tengo varios archivos que tienen el siguiente formato:

Num  name1  name2  value

Así, por ejemplo, el archivo llamado in1.sp tiene este aspecto:

 C1    in1    out1        3.9e-12
 C2    foo    st1/in1     1.2e-14
 C3    foo2   in1         8.3e-14
 ...

etcétera. En todas las líneas, una de las columnas de nombre contiene el nombre del archivo. Quiero eliminar toda la entrada si contiene el nombre del archivo, incluso si hay otro texto. Entonces, si arriba es la entrada, la salida deseada sería:

 C1    out1    3.9e-12
 C2    foo     1.2e-14
 C3    foo2    8.3e-14
 ...

¡Gracias!

Respuesta1

Si también te entiendo bien, prueba esto.

for f in *.sp; do 
  sed "s/[^ ]*${f%.*}[^ ]*//" "$f" | column -t
done

Producción:

C1  out1    3.9e-12
C2  foo     1.2e-14
C3  foo2    8.3e-14

Respuesta2

Si le entiendo correctamente, desea eliminar cualquier valor de campo que contenga una coincidencia con el nombre del archivo (menos su extensión).

Si es así, podrías hacer un campo grepen perl:

$ cat in1.sp 
 C1    in1    out1        3.9e-12
 C2    foo    st1/in1     1.2e-14
 C3    foo2   in1         8.3e-14

entonces

$ perl -alpe '$_ = join "\t", grep { $_ !~ (split(/\./,$ARGV))[0] } @F' in1.sp 
C1  out1  3.9e-12
C2  foo   1.2e-14
C3  foo2  8.3e-14

Respuesta3

Puede utilizar awkpara seleccionar las columnas deseadas.

$ awk '{print $1 "\t" $2 "\t" $4}' in1.sp 
C1  in1 3.9e-12
C2  foo 1.2e-14
C3  foo2    8.3e-14

Esto funcionará siempre que se garantice que los campos dentro de las columnas no estén vacíos y nunca contengan espacios en blanco.

información relacionada