Печатать только те строки файла с уникальным значением первого столбца и определенным значением третьего столбца

Со стороны клемм

В конфигурации каждого терминала или средства запуска терминала установите переменную среды, например. 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

Строка *)является резервной, если родительский процесс не является одним из распознанных случаев. Вы можете оставить его, если вам нечего делать в этом случае.

0
19.01.2021, 17:34
3 ответа

В этом случае на ум приходит подход с двойным -проходом:

awk -F',' 'NR==FNR{seen[$1]++;next} $3=="add" && seen[$1]==1' file.txt file.txt

Это обработает входной файл дважды (, следовательно, он указывается два раза как аргумент ).

  • В первом проходе, где NR, глобальный счетчик строк, равен FNR, счетчику -строки файла -, мы только подсчитываем, как часто это конкретное значение первого поля встречается, но в противном случае немедленно пропускает обработку (оператора next).
  • На втором проходе мы проверяем, равно ли третье поле addи что первое поле встречается только один раз. Если это так, мы печатаем строку (, потому что эти два условия оцениваются как true).
1
18.03.2021, 22:36

Так как AdminBee уже показал способ awk-, вот еще один подход со стандартными утилитами:

 sort -t',' -k1,1 file | uniq -u -w 1 | grep 'add$'
  • sortиспользование запятой в качестве разделителя и сортировка только по полю 1
  • uniqпечатает только уникальные строки, но проверяет не более 1(!)символов в строке
  • теперь grepстрок, заканчивающихся на "добавить"

Ограничение:uniqКонечно, проверяется только один символ. Для двух -или более -цифр в поле 1 необходимо предварительно обработать поле 1, например. с нулевым отступом -слева, а затем соответствующим образом увеличьте количество символов для проверки. Сортировку можно пропустить, если ваш файл уже отсортирован, как указано в вашем примере.

0
18.03.2021, 22:36

за один раз с 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
0
18.03.2021, 22:36

Теги

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