Как удалить всю запись, содержащую шаблон?

Как удалить всю запись, содержащую шаблон?

У меня есть несколько файлов следующего формата:

Num  name1  name2  value

Так, например, файл с именем in1.sp выглядит так:

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

и так далее. Во всех строках один из столбцов имени содержит имя файла. Я хочу удалить всю запись, если она содержит имя файла, даже если есть другой текст. Так что если выше — это входные данные, желаемый вывод будет:

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

Спасибо!

решение1

Если я вас правильно понял, попробуйте это

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

Выход:

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

решение2

Если я правильно вас понял, вы хотите удалить все значения полей, содержащие совпадение с именем файла (без его расширения).

grepЕсли да, то вы могли бы сделать это в полевых условиях perl:

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

затем

$ 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

решение3

Вы можете использовать awkдля выбора нужных столбцов

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

Это будет работать до тех пор, пока поля внутри столбцов гарантированно не будут пустыми и не будут содержать пробелов.

Связанный контент