Если вы хотите сделать это с помощью скрипта Python:
#!/usr/bin/env python
##
# use: ingest.py infile1 infile2... infilen
import math,re,argparse
parser = argparse.ArgumentParser()
parser.add_argument('infiles', type=str, help='infile names', nargs='+')
args = parser.parse_args()
for infile in args.infiles:
with open(infile) as in_file, open(infile+".out", "w+") as out_file:
column_names = in_file.readline().split()
out_file.write("N (k/(s/300.0000)) Abs(S)/E exp(Abs(S)/E)\n")
for line in in_file.readlines():
column_values = [float(x) for x in line.split()]
value_dict = dict(zip(column_names,column_values))
div = value_dict["k"]/(value_dict["s"]/300.0000)
ABS = abs(value_dict["S"])/value_dict["E"]
EXP = math.exp(abs(value_dict["S"])/value_dict["E"])
out_file.write("{N} {DIV} {ABS} {EXP}\n".format(N=value_dict["N"],DIV=div,ABS=ABS, EXP=EXP))
Причина, по которой вы получаете сообщение об ошибке, заключается в том, что ваша строка поиска содержит символы /
, которые перепутаны с символами-маркерами. Другими словами, вы просите sed
сделать это:
sed "//home/mytest/datasr123/d"
, что приводит к ошибке, которую вы видели. IOW, шаблон не может содержать символ, который вы используете в качестве маркера. Если вы знаете, что ваш шаблон не содержит данного символа, вы можете использовать этот символ в качестве маркера; например. поскольку в вашей строке поиска нет ;
, вы можете сделать это:
sed "\;/home/mytest/datasr123;d"
или в терминах$i
:
sed "\;$i;d"
См. справочную страницу sed
в разделе Addresses
для получения подробной информации о том, как указывать адреса.
Конечно, полезность этого зависит от того, знаете ли вы символ, который никогда не будет встречаться в ваших строках поиска. :Любой символ подойдет в качестве маркера, но если ваша строка поиска вводится пользователем, есть нет гарантий, что то, что вы выберете, не встретится в строке поиска -, вам придется просмотреть ее, чтобы найти символ, который в ней не встречается.
И самый простой способ — вообще не использовать sed
,но вернитесь к grep (с благодарностью @Kusalananda за исправление моих ошибок с костями -во главе):
grep -v -F -e "$i" -- <file>
покажет только те строки, которые не соответствуют шаблону (это-v
--F
указывает grep интерпретировать строку буквально, а не как регулярное выражение, так что, например, *
и .
совпадают буквально; -e
позволяет шаблону начинаться с -
и не интерпретироваться как опция grep
; а --
позволяет имени файла начинаться с -
и не интерпретироваться как опция grep
; последние два всегда хорошо иметь в grep
вызове внутри скрипта, так как вы никогда не знаете, когда может возникнуть такая ситуация, хотя обычно нам это сходит с рук, когда grep
вызывается интерактивно ).
НО N.B. :Вопрос был отредактирован, и изменение шаблона полностью аннулировало каждый метод в этом ответе. Шаблон соответствует обеим строкам во входных данных, поэтому обе они будут удалены. Вам придется как-то переосмыслить шаблон, например. не ищите "$i"
, так как это будет соответствовать обоим; вместо этого ищите "${i} "
, где дополнительный пробел будет соответствовать первой строке, но не второй, или "${i}s"
, чтобы соответствовать второй строке, но не первой. Также обратите внимание, что с -F
вы не можете использовать классы символов (, поэтому \b
отсутствует ).
Оригинал grep -iwoP
, похоже, не отражает идею «точного совпадения»... однако
Чтобы удалить целые строки, точно соответствующие строке поиска, необходимо привязать ее к началу ^
и концу $
строки.
sed "\|^$i$|d" C1.txt