У меня есть два файла, из которых я хочу создать третью, которая содержит всю информацию.
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]
Использование 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
Немного 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 - новая строкаИспользование 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
Иногда это может быть более понятно.