удаление строки со строкой и предыдущей строки в нескольких файлах - PullRequest
0 голосов
/ 10 мая 2018

Я хочу удалить все строки, в которых есть 'n -----' и строка перед ним. Мне удалось сделать это в одном файле с:

 sed -i '' -n '/n-----/{s/.*//;x;d;};x;p;${x;p;}' FileName.fasta | sed '/^$/d'

Но попытка сделать это с несколькими файлами приводит к тому, что в некоторых файлах что-то портится, например, добавление строки, которой раньше не было:

 sed -i '' -n '/n-----/{s/.*//;x;d;};x;p;${x;p;}' *.fasta | sed '/^$/d'

Я предполагаю, что в синтаксисе что-то не так, поскольку я использую конвейер, но не знаю, что именно. Должно быть что-то простое, я думаю. Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Представьте, что у вас есть следующие входные файлы:

ВХОД:

$ more file*.in
::::::::::::::
file2.in
::::::::::::::
u
v
w
n----- to remove
u
v
w
n----- to remove
u
::::::::::::::
file.in
::::::::::::::
a
b
c
n----- to remove
a
b
c
n----- to remove
a

COMMAND:

СДЕЛАЙТЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ СВОИХ ФАЙЛОВ ПЕРЕД ТЕСТИРОВАНИЕМ ЕГО !!!

$ for f in `grep -l "^n-----" *.in`; do echo "processing file: $f"; sed -n '/n-----/{s/.*//;x;d;};x;p;${x;p;}' "$f" | sed '/^$/d' > "${f}.out" && mv "${f}.out" "$f"; done
processing file: file2.in
processing file: file.in

Пояснения:

для всех входных файлов, которые содержат строки, начинающиеся с ^n-----, он запустит команду sed и перенаправит вывод sed в файл tmp и переместит его обратно в исходный файл (перезаписанный) если команда sed завершается успешно.

ВЫВОД:

$ more file*.in
::::::::::::::
file2.in
::::::::::::::
u
v
u
v
u
::::::::::::::
file.in
::::::::::::::
a
b
a
b
a
0 голосов
/ 10 мая 2018

Это может сработать для вас (GNU sed):

sed -i 'N;/\nn---/d;P;D' file1 file2 ...

Это создает двухстрочное окно по всему файлу и удаляет обе строки, если вторая начинается n---. -i редактирует файлы на месте, создавая временный файл и переименовывая его в исходный после редактирования.

0 голосов
/ 10 мая 2018

Для гну сед,

sed -s 

обрабатывает каждый файл как отдельный файл.

Например, если у вас есть 3 одинаковых файла a, b и c-no.txt:

cat *-no.t?t
1
2
3

1
2
3

1
2
3

Без -s следующая команда удалит строки из строки 3 в файле a, содержащем 3, в следующий файл b, чтобы удалить строку 1 и т. Д. Для файлов b / c и в c от 3 до конца файла :

sed '/3/,/1/d'  *-no.t?t
1
2
2
2

При использовании -s каждый файл обрабатывается как единичный объект, поэтому в каждом файле после конца файла не выполняется поиск подходящей строки 1:

sed -s '/3/,/1/d'  *-no.t?t
1
2
1
2
1
2

Синтаксис для нескольких опций и параметров не является особенным, вы можете использовать

sed -i -s 
sed -s -i 
sed -is 
sed -si 

и создайте больше вариантов с большим количеством опций / параметров.

...