Como você remove uma entrada inteira que contém um padrão?

Como você remove uma entrada inteira que contém um padrão?

Eu tenho vários arquivos que têm o seguinte formato:

Num  name1  name2  value

Então, por exemplo, o arquivo chamado in1.sp fica assim:

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

e assim por diante. Em todas as linhas, uma das colunas de nome contém o nome do arquivo. Quero remover a entrada inteira se ela contiver o nome do arquivo, mesmo que haja outro texto. Portanto, se acima for a entrada, a saída desejada seria:

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

Obrigado!

Responder1

Se eu também entendi corretamente, tente isso

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

Saída:

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

Responder2

Se bem entendi, você deseja remover qualquer valor de campo que contenha uma correspondência com o nome do arquivo (menos sua extensão).

Nesse caso, você poderia fazer uma análise de campo grepem perl:

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

então

$ 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

Responder3

Você pode usar awkpara selecionar as colunas desejadas

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

Isso funcionará desde que os campos dentro das colunas não estejam vazios e nunca contenham espaços em branco.

informação relacionada