Печать массивов без дубликатов в AWK

Вы можете отредактировать их в исходном коде, где они определены , и пересобрать пакет:

Теоретически, evince должен читать файл ускорений в время инициализации и объединяться с теми, которые у него есть, поэтому вы также можете изменить файл ускорений в ~/.config/evince/accels. Имейте в виду, что он перезаписывается, если есть синтаксические ошибки.

3
17.11.2020, 08:56
2 ответа

Используйте join, если хотите, чтобы это было как можно проще;

join -1 2 -2 1 -o 2.2 1.1 2.1 <(sort -unk2,2 file1) <(sort -unk1,1 file2) 2>/dev/null

joinво втором поле первого файла -1 2с первым полем второго файла -2 1в качестве ключей.

и -oвыводят эти поля:
второе поле из второго файла2.2
первое поле из первого файла1.1
и первое поле из второго файла2.1

это сортирует первый файл по второму полю как ключ численноsort -unk2,2 file1
и это сортирует второй файл по первому полю как ключ в числовом виде sort -unk1,1 file2и удалите дубликаты -uиз обоих файлов.


awk решение:

awk '!second_file{ Ids[$2]=$1; next }
     ($1 in Ids) { print $2, Ids[$1], $1 }' file1 second_file=1 <(sort -u file2)
7
18.03.2021, 22:49

Причина, по которой печатается неполная строка, заключается в том, что в вашем коде вы не удаляете значения, которые хотите удалить из массива, а заменяете их значения пустыми строками.

Это приводит к тому, что проверка $1 in id2id{ ... }оценивается как trueдля значений, являющихся пустыми строками.

Решение состоит в том, чтобы заменить код id2id[$1]=""на delete id2id[$1], после чего все должно работать как положено.

Вот немного упрощенная версия кода:

awk 'NR == FNR { a[$2] = $1; next }
     $1 in a { print a[$1], $2, $1; delete a[$1] }' file1.txt file2.txt

В один -вкладыш:

awk 'NR==FNR{a[$2]=$1;next} $1 in a{print a[$1],$2,$1; delete a[$1]}' file1.txt file2.txt

Преимущество использования awk вместо join заключается в простоте и легкости настройки.

Недостатком является то, что перед слиянием первый файл сохраняется в ОЗУ, поэтому он не будет эффективно обрабатывать большие файлы.

7
18.03.2021, 22:49

Теги

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