У меня есть две текстовых таблицы как указано ниже:
file1.txt
1 A a
2 B b
3 C c
4 D d
file2.txt
A x i
C z iii
D w iiii
B y ii
Я хочу иметь
final.txt
1 A a x i
2 B b y ii
3 C c z iii
4 D d w iiii
$ join -12 -21 -o 1.1,1.2,1.3,2.2,2.3 <(sort file1.txt) <(sort file2.txt) > final.txt
1 A a x i
2 B b y ii
3 C c z iii
4 D d w iiii
join -12
= файл 1 столбец 2 (ABCD), -21
= файл 2 столбец 1 (ABCD)
-o
= вывод, 2.3
= файл 2, столбец 3.
$ paste -d' ' <(sort file1.txt) <(sort file2.txt) | awk -F ' ' '{print $1, $2, $3, $5, $6}' > final.txt
1 A a x i
2 B b y ii
3 C c z iii
4 D d w iiii
Это может быть задано сценарием в Python:
#!/usr/bin/env python3
import sys
with open(sys.argv[1]) as f1,open(sys.argv[2]) as f2:
for f1_line in f1:
f2_line = f2.readline()
print(" ".join([f1_line.strip(),f2_line.strip()]))
Работы как так:
$ ./merge.py file1.txt file2.txt
1 A a A x i
2 B b C z iii
3 C c D w iiii
4 D d B y ii
Можно создать final.txt с оператором перенаправления оболочки ./merge.py file1.txt file2.txt > final.txt
Если Вы имеете sqlite3
установленный и эти два файла та же длина, можно написать сценарий этого в SQL, так как соединения поля таблицы точно, что SQL разработан, чтобы сделать:
sqlite3 <<EOF
.mode csv
.separator " "
CREATE TABLE tb1 (col1 INT,col2 TEXT,col3 TEXT);
CREATE TABLE tb2 (col1 TEXT,col2 TEXT,col3 TEXT);
.import file1.txt tb1
.import file2.txt tb2
SELECT * FROM tb1 JOIN tb2 on tb1.rowid=tb2.rowid;
EOF
Который работает так:
$ bash merge.sqlite
1 A a A x i
2 B b C z iii
3 C c D w iiii
4 D d B y ii
Обратите внимание, что исходные файлы не должны иметь запаздывания новых строк, иначе будут ошибки, брошенные SQLite.