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