Как взять только уникальные строки на основе столбца с помощью linux cmd?

Похоже, веб-сайт ожидает сертификат клиента, поэтому он может специально поддерживать режим PIV (Smart Card )только YubiKey, а не режим FIDO U2F.

Для этого необходимо установить пакеты ccidи opensc, а также пакет nssдля инструмента modutil, а затем настроить браузер Chrome для использования /usr/lib/opensc-pkcs11.so. Для этого сначала закройте все экземпляры браузера и используйте команду, подобную этой:

modutil -dbdir sql:$HOME/.pki/nssdb/ -add "Smart card/YubiKey PKCS#11" -libfile /usr/lib/opensc-pkcs11.so

По сути, режим YubiKey PIV эмулирует комбинацию считывателя смарт-карт, совместимого с CCID -, и смарт-карты, совместимой с PKCS #11.

(Источники:эта часть страницы ArchWiki YubiKey и инструкции по аутентификации смарт-карты CAC .)

CCID — это аппаратный стандарт для взаимодействия с вещами, похожими на -USB-устройства чтения смарт-карт, а PKCS #11 — программный стандарт для связи со смарт-картами PIV. Чтобы преодолеть разрыв между ними, драйвер ccidдля службы pcscdпредоставляет программный интерфейс ПК/SC для низкоуровневой связи -с любой смарт-картой -, подобной устройствам для любая цель,и openscпредоставляет библиотеку, которая использует низкоуровневый -интерфейс PC/SC и предоставляет программный интерфейс более высокого -уровня, совместимый с PKCS #11, специально для целей PIV. (Да, это сложная, многослойная -система.)

Chrome, как и Chromium, использует общую базу данных NSS по адресу $HOME/.pki/nssdbдля управления сертификатами. Команда добавляет ссылку на библиотеку OpenSC PKCS #11, которая используется для доступа к совместимым считывателям смарт-карт и аналогичным устройствам :, по сути, сообщает любому устройству, использующему общую базу данных NSS (, включая Chrome )«вы можете использовать смарт-карту --как устройства в качестве потенциального источника клиентских -сертификатов для аутентификации, и вот как вы можете взаимодействовать с подсистемой чтения смарт-карт этого компьютера».

Эта команда не требует подключения YubiKey во время ее запуска, но важно, чтобы браузер Chrome не работал, когда вы запускаете команду :, если браузер запущен, он уже прочитает базу данных NSS и перезапишет ее старыми значениями при выходе, фактически отменив команду.

По какой-то причине Chrome не включает графический интерфейс для настройки этого параметра, поэтому для его настройки требуется инструмент modutilиз пакета nss.

Если вам нужно устранить неполадки с этим набором -, сначала подключите YubiKey и используйте opensc-tool --list-readers, чтобы убедиться, что уровень OpenSC видит YubiKey. Ответ должен быть похож на этот:

$ opensc-tool --list-readers
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Yubico YubiKey OTP+FIDO+CCID 00 00

Если это не работает, убедитесь, что процесс-демон pcscdзапущен.

Затем используйте opensc-tool --reader N --name -v, где N — «номер считывателя карт» YubiKey слева -самый крайний столбец вывода предыдущей команды (должен быть равен 0, если у вас нет другого считывателя смарт-карт -как устройства ), чтобы убедиться, что OpenSC распознает наличие PIV-контента на YubiKey.Ответ на последнюю команду должен включать эту строку:

Card name: Personal Identity Verification Card

Второй этап устранения неполадок заключается в запуске браузера Chrome и переходе в «Настройки» -> «Дополнительно» -> «Конфиденциальность и безопасность» -> «Управление сертификатами». На этом этапе система должна открыть окно с запросом PIN-кода YubiKey :. Это побочный эффект необходимости доступа к YubiKey для отображения информации о нем. Это подтверждает, что Chrome теперь может использовать библиотеку PKCS #11 для доступа к функциям YubiKey PIV через OpenSC.

После ввода PIN-кода на странице «Ваши сертификаты» экрана «Управление сертификатами» должно быть указано, что доступен как минимум один сертификат клиента с аппаратной -поддержкой. Вы можете выбрать просмотр сертификата на этом этапе :. Информация должна соответствовать тому, что должно быть на вашем YubiKey, то есть, если у вас есть вопросы о содержимом, вы должны обратиться к лицу или организации, выдавшей вам YubiKey.

Если сертификат, хранящийся в YubiKey, виден Chrome, теперь вы должны быть готовы получить доступ к аутентифицированному сайту YubiKey PIV -. Как только браузер запросит PIN-код YubiKey, он сможет получить доступ к YubiKey до тех пор, пока вы не выйдете из браузера или не отключите YubiKey, поэтому он не должен запрашивать PIN-код более одного раза за сеанс браузера.

Если у вас уже запущен браузер, когда вы подключаете YubiKey, может потребоваться несколько секунд, чтобы распознать, что YubiKey подключен. Поэтому после подключения ключа вам следует подождать несколько секунд, прежде чем переходить по ссылке. ведущий на аутентифицированный сайт.

2
28.10.2021, 09:39
6 ответов

украсить/сортировать/использовать/не украшать с помощью любой версии обязательных инструментов POSIX и любых символов в вашем вводе (, если ваш ввод на самом деле не является CSV с полями в кавычках, которые могут содержать запятые и/или символы новой строки, но тогда все остальные ответы также потерпит неудачу )и сохранит порядок строк ввода для вывода и откроет ввод только один раз, поэтому он будет работать, если ввод поступает из канала или файла и без сохранения всего ввода в памяти:

$ awk 'BEGIN{FS=OFS=","} NR>1{print ++cnt[$1], NR, $0}' file |
    sort -nt, -k1,1r -k2,2 |
    awk -F, '(!seen[$3]++) && ($1==1)' |
    cut -d, -f3-
f,g,h
x,t,k
2
28.10.2021, 13:51

Это удаляет первую строку(col1,col2,col3)и всегда выводит строки в том же порядке, что и ввод:

perl -nlE'/.*?,/;$.-1&&push@a,[$&,$_];$a{$&}++;say$$_[1] for grep$a{$$_[0]}<2&eof,@a' data
3
28.10.2021, 23:29

Здесь используются bashи BSD sedи может потребоваться настройка для систем, отличных от -Berkeley:

$ cat << EOF > input
col1,col2,col3
a,b,c
a,d,f
d,u,v
f,g,h
d,u,g
x,t,k
EOF
$ grep -f <(sed -Ee '1d;s/([^,]*),.*/^\1,/' < input | sort | uniq -u ) input
f,g,h
x,t,k

Это работает, сначала используя sedдля удаления строки 1 входного файла input, а затем записывая первое поле с разделителями-запятыми -каждой строки, которому предшествует ^, а затем следует ,. Этот вывод sedзатем редактируется sortи uniqтаким образом, что в выводе появляются только строки, не имеющие дубликатов. Вывод uniqзатем передается в grepи используется как последовательность регулярных выражений для поиска во входном файле.

Это решение, скорее всего, не работает, если ваш входной файл содержит определенные метасимволы регулярного выражения -в первом столбце.

3
29.10.2021, 00:00
  • Порядок не имеет значения
awk -F "," '
{
  a[$1] = $1 in a ? "" : ($0 ORS)
}
END {
  for (i in a) printf "%s", a[i]
}
' file

  • Порядок такой же, как при вводе
awk -F "," '
{
  if ($1 in a) a[$1] = ORS
  else a[b[++k]=$1] = $0 RS
}
END {
  while(++i in b) print a[b[i]]
}
' ORS= file
1
30.10.2021, 06:57
  • GNU sed с расширенной поддержкой регулярных выражений (-E)
sed -Ee ':b;$!{N;bb;}
/^(([^,]+,).*)\n\2[^\n]+/!{P;D;}
  :a;s//\1/;ta;D
' file
  • глотать файл в пространство шаблона.
  • до тех пор, пока первая строка в пространстве шаблонов нигде не совпадает с первым полем (означает, что она уникальна )она печатается и обрезается.
  • в противном случае, то есть первое поле первой строки нашло совпадение в последующих строках, мы удаляем все такие строки.

Метод groupby в itertools используется для группировки по первому полю, а затем выбираются группы, содержащие один элемент.

python3 -c 'import sys, itertools as it

## anonymous function defined here
Gx = lambda fh,col: it.groupby(sorted(fh,key=col),col)
k1 = lambda x: x.split(",")[0]
fx = lambda t: "".join(t[1])
gx = lambda y: y.count("\n") == 1

with open(sys.argv[1]) as f:
 
 print(*filter(gx,map(fx,Gx(f,k1))),sep="",end="")
' file

awk -F "," '
BEGIN { s[1] = ORS }
{
  sep = s[$1 in a]
  a[$1] = a[$1] sep sprintf("%dd",NR)
}
END {
  for (var in a)
    if (split(a[var],t,ORS) >= 2)
      print a[var]
}
' < file | sed -f - file
1
30.10.2021, 08:03

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

    ~$ raku -e ' \
    my @csv_array   = $*ARGFILES.lines.skip(1).map: *.split(",");  \
    my $col1        = @csv_array.map( *.[ 0,3...*]);  \
    my @col1_nodups = $col1.cache.Bag.grep( *.value == 1).map: *.keys;  \
    $_.join(",").put  for @csv_array[ $col1.grep(/@col1_nodups/, :k)];'  file

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

col1,col2,col3
a,b,c
a,d,f
d,u,v
f,g,h
d,u,g
x,t,k

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

f,g,h
x,t,k

Несмотря на то, что в заголовке этого вопроса появляется слово «uniq», ОП не запрашивает возврат всех строк на основе различных значений в столбце 1, а скорее удаляет все строки с повторяются значения в столбце 1.

Выше приведено решение, написанное на Raku, члене семейства языков программирования Perl.:

  • Четыре приведенные выше строки кода можно вставить в командную строку bash.с целью file, заданной (, как показано выше ), для достижения желаемых результатов.
  • В качестве альтернативы, четыре строки кода, сохраненные в сценарии, например return_singleton_rows_only.p6. Измените первую строку $*ARGFILESна "/path/to/csv_file.txt".IOи удалите обратную косую черту в конце -из -строки (продолжения ). Затем сценарий может быть выполнен в командной строке bash с ~$ raku return_singleton_rows_only.p6.
  • Альтернатива (2 ), сохраняя первую строку $*ARGFILESкак -, вы можете сохранить четыре строки кода в скрипт, например return_singleton_rows_only.p6(, удалив конец -из -продолжение строки с обратной косой чертой ), добавьте соответствующую строку #!shebang вверху (, например #!/usr/bin/env raku), и сделайте файл исполняемым. Затем запустите в командной строке ~$ return_singleton_rows_only.p6 file.

Вкратце, строка 1 считывает csv_fileв массив Raku с именем @csv_array, разделяя на " ," (запятые )и пропуская строку заголовка. Строка 2 извлекает столбец 1 в скалярный список с именем $col1. Строка 3 удаляет любое значение, присутствующее в $col1, с помощьюBag-ging и сохраняет только *.keys, которые имеют *.value == 1. Наконец, строка 4 подмножает исходный @csv_arrayс помощью индекса, созданного с помощью grep-, пингующего номер строки нужных строк.

[Я уверен, что есть более эффективные подходы, но этот код имеет преимущество 1 ). чтение linesлениво, а 2 ). имеющие одноэлементные значения, доступные как отдельный объект массива @col1_nodups, если они потребуются для дальнейшей обработки данных].

https://raku.org

1
01.11.2021, 12:58

Теги

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