Объединить два файла, используя общий столбец

Несколько недель назад у меня была такая же проблема на моем ноутбуке. Он игнорировал мой GRUB2 и запускал Windows напрямую. Вот как я решил эту проблему:

  1. Переименуйте каталог /boot/efi/EFI/Microsoftв Microsoft0
  2. .
  3. Измените путь в chainloader /EFI/Microsoft/Boot/bootmgfw.efiсоответственно на/EFI/Microsoft0/Boot/bootmgfw.efi

Похоже, что BIOS моего ноутбука всегда ставит загрузчик Microsoft вверху списка, независимо от того, как вы его настроите. Таким образом, переименование каталога Microsoftв разделе EFI может обмануть BIOS, и он не загрузится в Windows автоматически.

0
02.03.2021, 12:49
3 ответа

Вы должны указать разделитель полей FS, а OFSиспользуется для разделителя выходных полей.

awk 'BEGIN        { FS=OFS="," }
     NR==FNR      { saving[$1]=$2; next }
    ($1 in saving){ print $1, saving[$1], $2 }' file1  file2
2
18.03.2021, 22:27

Проблема с вашим кодом awkв основном двоякая:

  1. Вы не указываете awkиспользовать ,в качестве разделителя полей. Вы можете сделать это с помощью -F,.
  2. Вы никогда не проверяете, является ли $1ключом в массиве a. Вы можете сделать это с $1 in aв качестве условия перед последним блоком вашего кода. Это можно пропустить, если вы ожидаете, что все имена во втором файле присутствуют в первом (, но вы ничего не говорите об этом ).

Вы также выводите поля в неправильном порядке по сравнению с ожидаемым выводом, и вы используете разделитель вывода по умолчанию, который является пробелом, а не запятой(OFS = ","или OFS = FS, в BEGINblock исправит это ).

$ awk -F, 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 }' file1 file2
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

$ join -t, <( sort file1 ) <( sort file2 )
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

Это сортирует два файла и передает отсортированное содержимое утилите join. Утилита joinвыполняет реляционную операцию JOIN между двумя наборами данных в первом столбце (по умолчанию ), по сути INNER JOIN, если вы знакомы с SQL. Мы используем -t,с join, чтобы указать, что столбцы разделены запятыми -.

Если ваша оболочка не понимает процесс подстановки <(... ), то предварительно -отсортируйте данные. Утилита joinожидает отсортированный ввод.

sort -o file1.sorted file1
sort file2 | join -t, file1.sorted -
rm -f file1.sorted
2
18.03.2021, 22:27

Присоединяйтесь к нам:

join -t, <(sort file1) <(sort file2)
0
18.03.2021, 22:27

Теги

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