В конфигурации каждого терминала или средства запуска терминала установите переменную среды, например. TERM_SUBTYPE=tilix
или TERM_SUBTYPE=deepin
или TERM_SUBTYPE=vscode
. В вашем .zshrc
проверьте значение этой переменной:
case $TERM_SUBTYPE in
tilix) …;;
…
'') …;;
esac
Строка '')
— это случай, когда ничего не установлено TERM_SUBTYPE
. Вы можете оставить его, если вам нечего делать в этом случае.
Эмулятор терминала обычно является родителем оболочки, поэтому проверьте родительский процесс.
case ${$(ps -p $PPID -o comm=):t} in
tilix) …;;
deepin-terminal) …;;
code-insiders) …;;
*) …;
esac
Строка *)
является резервной, если родительский процесс не является одним из распознанных случаев. Вы можете оставить его, если вам нечего делать в этом случае.
В этом случае на ум приходит подход с двойным -проходом:
awk -F',' 'NR==FNR{seen[$1]++;next} $3=="add" && seen[$1]==1' file.txt file.txt
Это обработает входной файл дважды (, следовательно, он указывается два раза как аргумент ).
NR
, глобальный счетчик строк, равен FNR
, счетчику -строки файла -, мы только подсчитываем, как часто это конкретное значение первого поля встречается, но в противном случае немедленно пропускает обработку (оператора next
). add
и что первое поле встречается только один раз. Если это так, мы печатаем строку (, потому что эти два условия оцениваются как true
). Так как AdminBee уже показал способ awk
-, вот еще один подход со стандартными утилитами:
sort -t',' -k1,1 file | uniq -u -w 1 | grep 'add$'
sort
использование запятой в качестве разделителя и сортировка только по полю 1 uniq
печатает только уникальные строки, но проверяет не более 1(!)символов в строке grep
строк, заканчивающихся на "добавить" Ограничение:uniq
Конечно, проверяется только один символ. Для двух -или более -цифр в поле 1 необходимо предварительно обработать поле 1, например. с нулевым отступом -слева, а затем соответствующим образом увеличьте количество символов для проверки. Сортировку можно пропустить, если ваш файл уже отсортирован, как указано в вашем примере.
за один раз с awk:
awk -F ',' '
{ if ( ! seen[$1]++ )
{ if ( $3 == "add" )
keep[$1] = $0
}
else
{
if ( keep[$1] )
delete keep[$1]
}
}
END {
for (i in keep)
print keep[i]
}' infile