Файлы слияния с помощью общего столбца

У меня есть два файла, из которых я хочу создать одну треть, которая содержит всю информацию.

файл 1:

a 111 
b 222 
c 333 
d 666 
e 777 

файл 2:

111 x1  
222 x2
333 x3
444 x4 
555 x5 
666 x6 
777 x7 
888 x8

Я хотел бы объединить их как следующее:

111  x1  a
222  x2  b
333  x3  c
444  x4  0
555  x5  0
666  x6  d
777  x7  e
888  x8  0

Примечание:

Второй столбец файла 1 является подмножеством первого столбца файла 2

8
задан 9 February 2017 в 08:02

4 ответа

Эти join команда делает почти, в чем Вы нуждаетесь, если файлы отсортированы как в Ваших образцах:

join -12 -a2 file1 file2 -o2.1,2.2,1.1

просто необходимо добавить обнуление к строкам без соответствия. Можно использовать эти -e переключатель для этого:

join -12 -a2 file1 file2  -o2.1,2.2,1.1 -e0
7
ответ дан 16 November 2019 в 06:44

Используя q:

$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

Это может иногда быть более читаемо этот путь.

1
ответ дан 16 November 2019 в 06:44

Использование объединения:

join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1

Команда объединения объединяет строки двух файлов, которые совместно используют общее поле данных. В этом случае: Соедините файл2 и файл1, используя поле 1 (-1 1) файла2 и поле 2 (-2 2) файла1.

Выходными данными будут: «объединенное поле, поле 2 файла2, поле 1 файла1» (-o'0,1.2,2.1'), если отсутствует поле, укажите 0 (-e0)

Если в одном из двух файлов есть больше записей, добавьте их (в данном случае file2) (-a1)

См. Справочную страницу команды join

12
ответ дан 16 November 2019 в 06:44

Немного awk волшебство:

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
    printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
    file1 file2

или

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
    print $1,$2,a[$1]}' file1 file2

Вывод

111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

Объяснение

  • FNR==NR{a[$2]=$1;next}

    Работает file1 (FNR==NR) и создает структуру значения ключа. Ключ является вторым столбцом ($2) из file1, значение является первым столбцом ($1) из file1

  • {if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}

    Работает file2 и

    • if(a[$1]==""){a[$1]=0}

      Если ключ в первом столбце ($1) в file2 не существует в file1, нам нужен a 0

    • print $1,$2,a[$1]

      Печать (использование print) первое и второй столбец file2 и значение структуры значения ключа с ключом первого столбца ($1) из file2

      или

    • printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'

      Печать (использование printf) первое и второй столбец file2 и значение структуры значения ключа с ключом первого столбца ($1) из file2.

      • FS разделитель между столбцами, взятыми из входного файла

      • "%s%s%s%s%s\n"

        форматирование для вывода

        • %s - Строка

        • \n – Новая строка

5
ответ дан 16 November 2019 в 06:44

Другие вопросы по тегам:

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