Как искать строку, начиная со второго столбца

314
user9371654

У меня есть файл, который содержит строки, разделенные запятыми. Строки могут содержать точки (то есть не только буквенно-цифровые символы). Это пример:

site1.com,Level1.2 site2.com,Level1.1,Level1.0,Level1.2 site3.com,Level1.2 site4.com,Level1.2,Level1.1,Level1.0,Levelv3 siteLevel1.2,Levelv2 Level1.2,Levelv2 

Мне нужно выполнить поиск по именам сайтов (обратите внимание, что у меня нет определенного формата для имени сайта, т. Е. Он не всегда заканчивается на .com, поэтому я не должен учитывать, как выглядит первый столбец)

Мне нужны сайты, которые ТОЛЬКО содержат конкретную строку. В этом примере Level1.2 исключительно (без Level1.1, Level1.0 и Level3 ни до, ни после ). Затем напечатайте результат в новом файле, который соответствует условию (содержит только Level1.2). Таким образом, ключевые слова поиска начинаются со второго столбца (я не хочу, чтобы результат поиска находил соответствующий шаблон в имени сайта).

Так что, если я ищу Level1.2, новый файл должен содержать:

site1.com,Level1.2 site3.com,Level1.2 

Но результат моей команды:

site1.com,Level1.2 site3.com,Level1.2 siteLevel1.2,Levelv2 Level1.2,Levelv2 

Если есть сайт, который содержит Level1.2 в своем названии, он не должен учитываться, так как мне нет дела до первого столбца.

Я попробовал эту команду, и она работает для меня. Единственное, что мне нужно, чтобы поиск игнорировал появление строки поиска в первом столбце.

awk '/Level1.2/ && !/Level1.1/ && !/Level1.0/ !/Level3/' myfile.txt > result.txt 
0
Разве вы не можете просто сделать `grep 'Level1.2 $' myfile.txt`? Arkadiusz Drabczyk 6 лет назад 0
Для чего нужен `$`? и с помощью grep, если он находит его в строке с другими уровнями: Level1.1, я не хочу, чтобы он считал. Я хочу посчитать его, если он единственный в строке (после названия сайта) без других. user9371654 6 лет назад 0
`$` означает конец строки. Как насчет: `grep -E '^ site [0-9] + \ .com, Level1.2 $' myfile.txt`? Arkadiusz Drabczyk 6 лет назад 0
Но конец строки не означает, что Lev1.2 - единственный в строке. Этому могут предшествовать другие. В этом случае я не хочу этого. Что я хочу, так это убедиться, что Level1.2 - единственный, начиная с column2 и далее. т.е. мне нужно исключить появление любого другого уровня после column2. user9371654 6 лет назад 0
Попробуйте вторую команду `grep`, которую я написал. Arkadiusz Drabczyk 6 лет назад 0
Извините, это не делает цель. Первый столбец не имеет фиксированного формата. Я не могу использовать `^ site [0-9] + \. Com`. Моя команда верна, просто укажите мне, как искать, начиная со второго столбца, если вы знаете. Благодарю. user9371654 6 лет назад 0

2 ответа на вопрос

0
oliv

Вы можете попробовать это awk:

awk -F, '$2=="Level1.2" && NF==2' myfile.txt 

Ограничитель ввода установлен на ,. Команда печатает строки, содержащие 2 поля со вторым, имеющим соответствующую строку.

Мне нужно использовать мою команду. Я исправил опечатку сейчас. Это делает цель, исключая любую другую строку. Мне просто нужно начать поиск со второго столбца (в столбцах, разделенных запятыми, то есть после первой запятой), потому что строка поиска (Level1.2 может появляться в первом столбце, и мне наплевать на первый столбец). Можете ли вы помочь мне в этом? user9371654 6 лет назад 0
@ user9371654 Пожалуйста, обновите ваш вопрос с примером, который включает все возможные случаи, на которые вы хотите нацелиться. oliv 6 лет назад 0
обновлено. Пожалуйста, просто помогите мне, как начать поиск со второго столбца (т.е. я хочу игнорировать вхождение строки поиска в первом столбце). user9371654 6 лет назад 0
даже если у вас есть другое решение, мне хорошо, как я понимаю, по своему шаблону. Просто нужно знать, как искать со 2-го столбца. user9371654 6 лет назад 0
@ user9371654 Мой скрипт все еще работает с вашим обновленным примером ... oliv 6 лет назад 0
0
AFH

Следующие работы:

grep '^[^,]*,Level1\.2' myfile.txt | grep -v ',Level.*Level' 

Это пропускает первое поле и его запятую, а затем ищет совпадение с Level1.2; затем результат фильтруется путем игнорирования всех записей с последующими Level(любая Levelв первом поле не будет иметь предшествующей запятой).

Я предположил, что другой текст может быть добавлен Level1.2, если он не содержит Levelстроку. Если это не так, то вы можете использовать более простое:

grep '^[^,]*,Level1\.2$' myfile.txt 
(Мой ответ совпал с вашим согласием с ответом Олив, но я оставляю его, так как он предлагает альтернативный подход и может быть более адаптируем для связанных с поиском проблем.) AFH 6 лет назад 0

Похожие вопросы