сопоставить некоторые или все шаблоны с awk

Вот как это настроить вkonsole:

Также см. Справочник Kde по привязкам клавиш в Konsole .

Настройки -> Редактировать текущий профиль -> Клавиатура -> (выберите используемую раскладку клавиатуры)-> Редактировать -> Поиск/фильтр для Return.

Редактировать следующие записи (только левый столбец):

  • Изменить Return-Shift-NewLineнаReturn-Shift-Ctrl-NewLine
  • Изменить Return-Shift+NewLineнаReturn-Shift-Ctrl+NewLine

Это позволяет различать Enterи Ctrl+ Enter.

Добавьте следующую запись:

Return+Ctrl->\E[20;5~

Теперь просто добавьте bindkey '\e[20;5~' autosuggest-executeили любой другой приемник в ~/.zshrc.

1
28.09.2021, 13:35
5 ответов

Возможно, просто используйте предложение END, чтобы распечатать результаты.

    awk '/pat1/{v1=$4; next} /pat2/{v2=$5; next} /pat3/{v3=$6; next} /pat4/{v4=$5;} END{ print v1,"    ",v2,"    ",v3"    ",v4 }' myfile.out
0
28.09.2021, 17:37

Похоже, вам нужно что-то вроде:

$ cat tst.awk
BEGIN { OFS="     " }

{ sub(/\r$/,"") }

( ($NF ~ /pat1/) && (state == 0) ) ||
( ($NF ~ /pat2/) && (state == 1) ) ||
( ($NF ~ /pat3/) && (state == 2) ) ||
( ($NF ~ /pat4/) && (state == 3) ) {
    v[++state] = $NF
}

state == 4 {
    print v[1], v[2], v[3], v[4]
    state = 0
}

$ awk -f tst.awk file
pat1     pat2     pat3     pat4
pat1     pat2     pat3     pat4
pat1     pat2     pat3     pat4
1
28.09.2021, 17:59

Пытаясь адаптировать ответ @EdMorton к моей проблеме, я нашел нужную мне информацию в старой ветке , где он предоставил ответ и полностью решил проблему. вот мое решение:

awk '/pat1/{v1=$4; next}{v1="xxx"} /pat2/{v2=$5; next}{v2="xxx"} /pat3/{v3=$6;next}{v3="xxx"} /pat4/{v4=$5}{v4="xxx"} {print v1,"    ",v2,"    ",v3"    ",v4}' myfile.out

Теперь, когда один из шаблонов еще не существует, я получу на его место xxx. Я могу заменить xxxодним пробелом или любым другим значением.

Спасибо за все ваши предложения и помощь!

П.С. :Я обнаружил, что иногда бывает не так просто предоставить образец входных данных для объяснения проблемы. извините, если это привело к разочарованию!

0
28.09.2021, 20:20

Использование Raku (, ранее известного как Perl _6)

raku -e 'my @a; my @pat = <<pat1 pat2 pat3 pat4>>; for lines() { for @pat -> $i { @a.push( m[$i] // " __ " ) };};.put unless $_ eq " __   __   __   __ " for @a.rotor(4);'

Отвечаю на Раку из-за пустякового вопроса :что, если в строке содержится больше -, чем -искомого pattern? Или какие-то patternпоявляются не по порядку? Приведенный ниже код обрабатывает эти случаи (, а также удаляет строки, в которых шаблоны не найдены ).

См. последние несколько строк ввода сэмпла и результирующие извлеченные паттерны в последних нескольких строках вывода сэмпла. (Обратите внимание, я удалил пустые строки из примеров ниже):

Пример ввода:

some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here pat4
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here pat4
some more text here pat1 pat2
some more text here pat1 pat2 pat3 pat4

Пример вывода:

pat1  __   __   __ 
 __  pat2  __   __ 
 __   __  pat3  __ 
pat1  __   __   __ 
 __  pat2  __   __ 
 __   __  pat3  __ 
 __   __   __  pat4
pat1  __   __   __ 
 __  pat2  __   __ 
 __   __  pat3  __ 
 __   __   __  pat4
pat1 pat2  __   __ 
pat1 pat2 pat3 pat4

Обратите внимание, :распространенный случай, когда не обрабатывается приведенным выше кодом, — это случай, когда один шаблон встречается в нескольких копиях в строке. В приведенном выше коде нет механизма для подсчета вхождений, он просто сообщит вам, «виден» шаблон или нет. Пример ниже:

echo "text here pat2 pat2 pat2 pat4" | raku -e 'my @a; my @pat = <<pat1 pat2 pat3 pat4>>; for lines() { for @pat -> $i { @a.push( m[$i] // " __ " ) };};.put unless $_ eq " __   __   __   __ " for @a.rotor(4);'

Вывод дублированного шаблона:

__  pat2  __  pat4

http://raku.org

0
01.10.2021, 18:10

Вот решение, использующее bashмассивы иgrep:

#!/usr/bin/env bash

declare -a pats
pats=('pat1' 'pat2' 'pat3' 'pat4')

# find the width of the widest pattern:

wid=0
for pat in "${pats[@]}"
do
  if [[ ${#pat} > $wid ]]; then wid=${#pat}; fi
done

# The above might give misleading widths if your patterns are 
# regexes that are signifcantly shorter or longer than the text
# they might match, such as "[a-z][^[[:blank:]]]*[a-z]"

# If you prefer, specify a constant width for all columns here:

wid=10

pad() {
  # right-pad string $1 to length $2
  # if $1 is overlength, do nothing
  local fmt="$(printf "%%-%ds" $2)"
  printf "$fmt" "$1"
}

while IFS= read ln
do
  for pat in "${pats[@]}"
  do
    txt="$(grep -o "$pat" <<< "$ln" || echo '----')"
    printf "%s" "$(pad "$txt" $wid)"
    printf "  "
  done
  printf "\n"
done

Вход:

some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here pat4
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here pat4
some more text here pat1 pat2
some more text here pat1 pat2 pat3 pat4
some more text here pat4 pat3 pat2 pat1

Выход:

pat1        ----        ----        ----        
----        ----        ----        ----        
----        pat2        ----        ----        
----        ----        pat3        ----        
----        ----        ----        ----        
pat1        ----        ----        ----        
----        ----        ----        ----        
----        pat2        ----        ----        
----        ----        pat3        ----        
----        ----        ----        pat4        
pat1        ----        ----        ----        
----        ----        ----        ----        
----        pat2        ----        ----        
----        ----        pat3        ----        
----        ----        ----        pat4        
pat1        pat2        ----        ----        
pat1        pat2        pat3        pat4        
pat1        pat2        pat3        pat4        
0
01.10.2021, 22:28

Теги

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