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 grep
en 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 awk
para 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.