Почему команда sed пропускает некоторые строки в bash? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть файл csv, вершина которого выглядит следующим образом:

s_m_title
,,
7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
6555615_lig
7988114_lig2

Я хочу удалить каждую строку, которая не начинается с цифр. Затем я запустил команду sed, чтобы напечатать каждую строку, содержащую число, в новый файл csv.

sed -n -e '/1/{p;n;}' -e '/2/{p;n;}' -e '/3/{p;n;}' -e '/4/{p;n;}' -e '/5/{p;n;}' -e '/6/{p;n;}' -e '/7/{p;n;}' -e '/8/{p;n;}' -e '/9/{p;n;}' test_all.csv > improved2.csv

Верх этого нового файла csv выглядит следующим образом:

7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
7988114_lig2

Команда sed правильно удалила s_m_title и ,,, но также была удалена 6555615_lig. Почему?

Я понял, что если я сделаю это в виде двух команд,

sed '/,,/d' test_all.csv > improved3.csv

sed '/s_m_title/d' improved3.csv > improved2.csv

Я получу правильный вывод безудаляется любая из пронумерованных строк. Так почему же при использовании sed удаляются некоторые пронумерованные строки?

Ответы [ 3 ]

3 голосов
/ 10 октября 2019

Если вы просто пытаетесь повторить строки, начинающиеся с цифр, вы можете использовать это:

sed -n '/^[0-9]/p' test_all.csv

Или просто grep:

grep '^[0-9]' test_all.csv

Поведениевы видите, что с sed вызвано использование команды n, которая переходит к следующей строке ввода, когда вы выполняете команды.

  1. Sed читает вашу первую строку ввода [s_m_title], команды не совпадают, поэтому он ничего не отображает (из-за опции -n) и переходит к следующей строке текста.

  2. Это читает вторую строку [,,]. То же самое.

  3. Он читает третью строку [7988114_lig2], которая соответствует шаблону вашей первой команды [/ 1 /], поэтому он выполняет эту команду, печатая строку и перемещаясь кследующая строка ввода [7988114_lig2], но она остается на текущем месте в вашем списке команд. Так что теперь он сравнивает новую строку ввода с шаблоном второй команды [/ 2 /] ... и т. Д.

Просто так получается, что когда он читает строкус 6555615_lig это уже глубоко в вашем списке команд, после шаблона / 6 /. А так как строка не соответствует любым оставшимся командам [/ 7 /, / 8 / и / 9 /], sed достигает конца команд, ничего не отображает для этой строки ввода, получает следующую строку ввода [7988114_lig2]и начинается заново с первой командой.

3 голосов
/ 11 октября 2019

Печатает только те строки, которые начинаются с любого числа от 0 до 9

sed '/^[0-9]/!d' filename.csv
0 голосов
/ 10 октября 2019

Я считаю, что вы хотите напечатать любую строку с 1, 2, 3, 4, 5, 6, 7, 8 или 9. В этом случае:

sed -n '/[1-9]/p' test_all.csv 

Или:

sed '/[1-9]/!d' test_all.csv

В качестве альтернативы, чтобы напечатать все кроме первых двух строк, используйте:

sed '1,2d' test_all.csv

Или:

sed -n '3,$p' test_all.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...