Вот как это настроить в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
.
Возможно, просто используйте предложение 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
Похоже, вам нужно что-то вроде:
$ 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
Пытаясь адаптировать ответ @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
одним пробелом или любым другим значением.
Спасибо за все ваши предложения и помощь!
П.С. :Я обнаружил, что иногда бывает не так просто предоставить образец входных данных для объяснения проблемы. извините, если это привело к разочарованию!
Использование 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
Вот решение, использующее 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