onefish
onechicken
twofish
twochicken
twocows
threechicken
Что делать, если я хочу grep для строк, содержащих "два", но мне нужно только 2-го совпадения. Поэтому я хочу, чтобы результат был "двумя".
onefish
onechicken
twofish
twochicken
twocows
threechicken
Что делать, если я хочу grep для строк, содержащих "два", но мне нужно только 2-го совпадения. Поэтому я хочу, чтобы результат был "двумя".
попробуйте следующее:
awk '/two/{i++}i==2' file
с вашими данными:
kent$ echo "onefish
onechicken
twofish
twochicken
twocows
threechicken"|awk '/two/{i++}i==2'
twochicken
note: если ваш файл огромен, сделайте следующее:
awk '/two/{i++}i==2{print; exit}' file
grep -m2 "two" in-file.txt | tail -n1
Остановитесь после второго совпадения, затем произведите печать второй строки.
Если слово (здесь слово == два) повторяет несколько раз в одной строке, и вы хотите напечатать эту строку, используйте ниже:
word=two
n=2
line=`grep -m$n $word -o -n MyFile | sed -n $n's/:.*//p'`
awk 'FNR=='$line'{print; exit}' MyFile
например. Для ввода ниже:
onefish
onechicken
twotwofish
twochicken
twocows
threechicken
он напечатает twotwofish
вместо twochicken
.
Возможно, это не то, что хочет пользователь1787038, но добавил, чтобы ответить на мои собственные комментарии.
Следует отметить, что если строки threechicken
и twocows
были заменены, aka:
onefish
onechicken
twofish
twochicken
threechicken
twocows
то первый ответ Кента (awk '/two/{i++}i==2' file
) даст выход:
twochicken
threechicken
потому что для увеличения счетчика требуется другое совпадение совпадения. Его последний ответ: awk '/two/{i++}i==2{print; exit}' file
избегает этой проблемы.
grep и sed могут использоваться для фильтрации номера строки.
testfile:
onefish
onechicken
twofish
twochicken
threechicken
twocows
Получение нужной строки:
grep "two" testfile | sed -n 2p
prints "twochicken"
grep "two" testfile | sed -n 1p
prints "twofish"