Получить N-й результат awk

Эта команда awk должна выполнить трюк,

awk '{if ($1) {$1=strftime("%c",$1); print}}' /var/lib/misc/dnsmasq.leases

Старая версия, которая выведет эпоху Unix на пустые строки:

awk '{time=$1; $1=""; print strftime("%c",time) $0}' /var/lib/misc/dnsmasq.leases

Трюк заключается в применении strftime только к соответствующему аргументу и распечатать все остальное как есть. Я взял этот бит из этого вопроса. (Так как ваша функция strftime работала правильно, я предполагаю, что у вас установлен gawk. Если нет, сделайте sudo apt-get install gawk.)

2
задан 28 December 2017 в 19:49

3 ответа

Я чувствую, что вы задаете здесь два разных вопроса, поэтому я просто буду отвечать на оба.

Получить все совпадения

Здесь что-то странное, потому что команда

awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' <file.xml

уже должна выводить все совпадения вместо первого. Существует альтернатива (короткая и читаемая версия):

awk '/>23958742<\/PMID>/{f=1}f==1;/<\/PubmedArticle>/{f=0}' <file.xml
awk '/>23958742<\/PMID>/ {f=1}; f==1 {print}; /<\/PubmedArticle>/ {f=0}' <file.xml

Получить N-й матч

awk '/>23958742<\/PMID>/{i++}i==2&&k==1;/<\/PubmedArticle>/{k++}' <file.xml
awk '/>23958742<\/PMID>/ {i++}; i==2 && k==1 {print}; /<\/PubmedArticle>/ {k++}' <file.xml

Это просто подсчет вхождения ваших строк, сохраните отсчеты в i и k и распечатать каждую строку, пока выполняются условия i==2&&k==1. В качестве примера я выбрал второй блок, а третий - i==3&&k==2. Счет k приходит , если условия, потому что я понял, что вы хотите, чтобы и соответствующие строки также были напечатаны. Если вам нужно только то, что находится между строками поиска, поверните все вокруг:

awk '/<\/PubmedArticle>/{k++}i==2&&k==1;/>23958742<\/PMID>/{i++}' <file.xml
awk '/<\/PubmedArticle>/ {k++}; i==2 && k==1 {print}; />23958742<\/PMID>/ {i++}' <file.xml

Я всегда позволяю оболочке открывать входной файл и назначать его на stdin программы (<file.xml), потому что это имеет количество преимуществ, см. здесь. Я нашел помощь здесь и здесь.

Общее решение, предложенное здесь , таково:

awk -vn=2 '/>23958742<\/PMID>/{i++;k=1}i==n&&k==1;/<\/PubmedArticle>/{k=0}' <file.xml
awk -vn=2 '/>23958742<\/PMID>/ {i++;k=1}; i==n && k==1 {print}; /<\/PubmedArticle>/ {k=0}' <file.xml

Используя это, вам просто нужно установить n с опцией -v, например -vn=2 для второго матча.

1
ответ дан 22 May 2018 в 15:53

Я чувствую, что вы задаете здесь два разных вопроса, поэтому я просто буду отвечать на оба.

Получить все совпадения

Здесь что-то странное, потому что команда

awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' <file.xml

уже должна выводить все совпадения вместо первого. Существует альтернатива (короткая и читаемая версия):

awk '/>23958742<\/PMID>/{f=1}f==1;/<\/PubmedArticle>/{f=0}' <file.xml awk '/>23958742<\/PMID>/ {f=1}; f==1 {print}; /<\/PubmedArticle>/ {f=0}' <file.xml

Получить N-й матч

awk '/>23958742<\/PMID>/{i++}i==2&&k==1;/<\/PubmedArticle>/{k++}' <file.xml awk '/>23958742<\/PMID>/ {i++}; i==2 && k==1 {print}; /<\/PubmedArticle>/ {k++}' <file.xml

Это просто подсчет вхождения ваших строк, сохраните отсчеты в i и k и распечатать каждую строку, пока выполняются условия i==2&&k==1. В качестве примера я выбрал второй блок, а третий - i==3&&k==2. Счет k приходит , если условия, потому что я понял, что вы хотите, чтобы и соответствующие строки также были напечатаны. Если вам нужно только то, что находится между строками поиска, поверните все вокруг:

awk '/<\/PubmedArticle>/{k++}i==2&&k==1;/>23958742<\/PMID>/{i++}' <file.xml awk '/<\/PubmedArticle>/ {k++}; i==2 && k==1 {print}; />23958742<\/PMID>/ {i++}' <file.xml

Я всегда позволяю оболочке открывать входной файл и назначать его на stdin программы (<file.xml), потому что это имеет количество преимуществ, см. здесь. Я нашел помощь здесь и здесь.

Общее решение, предложенное здесь , таково:

awk -vn=2 '/>23958742<\/PMID>/{i++;k=1}i==n&&k==1;/<\/PubmedArticle>/{k=0}' <file.xml awk -vn=2 '/>23958742<\/PMID>/ {i++;k=1}; i==n && k==1 {print}; /<\/PubmedArticle>/ {k=0}' <file.xml

Используя это, вам просто нужно установить n с опцией -v, например -vn=2 для второго матча.

1
ответ дан 18 July 2018 в 00:18

Я чувствую, что вы задаете здесь два разных вопроса, поэтому я просто буду отвечать на оба.

Получить все совпадения

Здесь что-то странное, потому что команда

awk '/>23958742<\/PMID>/,/<\/PubmedArticle>/' <file.xml

уже должна выводить все совпадения вместо первого. Существует альтернатива (короткая и читаемая версия):

awk '/>23958742<\/PMID>/{f=1}f==1;/<\/PubmedArticle>/{f=0}' <file.xml awk '/>23958742<\/PMID>/ {f=1}; f==1 {print}; /<\/PubmedArticle>/ {f=0}' <file.xml

Получить N-й матч

awk '/>23958742<\/PMID>/{i++}i==2&&k==1;/<\/PubmedArticle>/{k++}' <file.xml awk '/>23958742<\/PMID>/ {i++}; i==2 && k==1 {print}; /<\/PubmedArticle>/ {k++}' <file.xml

Это просто подсчет вхождения ваших строк, сохраните отсчеты в i и k и распечатать каждую строку, пока выполняются условия i==2&&k==1. В качестве примера я выбрал второй блок, а третий - i==3&&k==2. Счет k приходит , если условия, потому что я понял, что вы хотите, чтобы и соответствующие строки также были напечатаны. Если вам нужно только то, что находится между строками поиска, поверните все вокруг:

awk '/<\/PubmedArticle>/{k++}i==2&&k==1;/>23958742<\/PMID>/{i++}' <file.xml awk '/<\/PubmedArticle>/ {k++}; i==2 && k==1 {print}; />23958742<\/PMID>/ {i++}' <file.xml

Я всегда позволяю оболочке открывать входной файл и назначать его на stdin программы (<file.xml), потому что это имеет количество преимуществ, см. здесь. Я нашел помощь здесь и здесь.

Общее решение, предложенное здесь , таково:

awk -vn=2 '/>23958742<\/PMID>/{i++;k=1}i==n&&k==1;/<\/PubmedArticle>/{k=0}' <file.xml awk -vn=2 '/>23958742<\/PMID>/ {i++;k=1}; i==n && k==1 {print}; /<\/PubmedArticle>/ {k=0}' <file.xml

Используя это, вам просто нужно установить n с опцией -v, например -vn=2 для второго матча.

1
ответ дан 24 July 2018 в 17:11

Другие вопросы по тегам:

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