Как удалить одну конкретную строку в файле и изменить следующую строку в Unix?
У меня есть текстовый файл, и при его создании произошла ошибка. Чтобы это исправить, мне нужно удалить строку с определенной уникальной строкой и удалить символы в следующей строке, предшествующие символу @. Я смог сделать это с помощью sed и cut, но он выводил только одну строку, а не многие другие тысячи строк в моем файле. Вот пример части файла, которую нужно исправить. Я знаю строку #s (удалите 45603341 и измените 45603342), где происходит эта ошибка.
@HWI-1KL135:70:C305EACXX:5:2105:6727:102841 1:N:0:CAGATC
CCAAGTGTCACCTCTTTTATTTATTGATTT@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC
Мне нужно, чтобы выходные данные выглядели так, чтобы остальная часть файла оставалась нетронутой.
@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC
Спасибо!
4 ответа
Как насчет:
sed -i -e '45603341d;45603342s/^.*\(@.*\)$/\1/' <filename>
где вы замените <filename>
с именем вашего файла.
Это может работать для вас (GNU sed):
sed '45603341!b;N;s/^.*\n[^@]*//' file
Оставьте как и любую другую строку 45603341
, В этой строке добавьте следующую строку, а затем удалите все с начала до первого@
в прилагаемой строке.
Если вы хотите изменить определенную строку и удалить вышеуказанную строку, выполните:
sed -ri '45603342s/^([^@]*)(@.*)$/\2/g; 45603341d' aa
Пример:
$ cat aa
@HWI-1KL135:70:C305EACXX:5:2105:6727:102841 1:N:0:CAGATC
CCAAGTGTCACCTCTTTTATTTATTGATTT@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC
$ sed -r '2s/^([^@]*)(@.*)$/\2/g; 1d' aa
@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC
Альтернативный подход к "sed" может заключаться в использовании макросов vim (это также работает в Windows). Основным недостатком является то, что вы не сможете интегрировать внутри скриптов, как это делает sed. Основным преимуществом является то, что он позволяет выполнять сложные замены, такие как "поиск по этому шаблону, затем очистить строку, перейти на 3 строки вниз, перейти к столбцу 40, переключить строки,...). Если вы уже знакомы с VIM, это также значительно более интуитивно понятный
В этом конкретном случае вам придется сделать что-то вроде
qq (start macro recording)
/^@HWI.*CAGATC$ (search pattern)
dd (delete line)
vw (select word)
d (delete selected word)
q (end macro)
Чтобы запустить макрос 100 раз:
100@q