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

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

file 1:

a 111 
b 222 
c 333 
d 666 
e 777 

file 2:

[ f2]

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

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 [ ! d5]

1
задан 9 February 2017 в 19:02

3 ответа

Использование join:

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

Команда join объединяет строки из двух файлов, которые имеют общее поле данных. В этом случае: Присоедините файл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

10
ответ дан 23 May 2018 в 15:09

Немного awk magic:

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, нам нужна 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 - новая строка
4
ответ дан 23 May 2018 в 15:09

Использование 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
ответ дан 23 May 2018 в 15:09
  • 1
    Для кого-то интересно, q находится в пакете python3-q-text-as-data (Python 3) и в пакете python-q-text-as-data (Python 2). – kos 10 December 2015 в 05:06
  • 2
    Спасибо, но где я могу получить этот пакет q? Кажется, я не могу установить ни python-q-text-as-data, ни python3-q-text-as-data. «E: невозможно найти пакет python3-q-text-as-data». Моя система уже установила python, python2.7, python3 и python3.4. – Paddy Landau 15 December 2015 в 17:42
  • 3
    Возможно, пакет слишком новый и недоступен в вашем дистрибутиве. Вы можете клонировать его Github: github.com/harelba/q – Vi. 15 December 2015 в 20:17

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

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