У меня есть несколько файлов следующего формата:
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
Это будет работать до тех пор, пока поля внутри столбцов гарантированно не будут пустыми и не будут содержать пробелов.