Выражения слияния с непосредственным соединением

У меня есть две текстовых таблицы как указано ниже:
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 
1
задан 2 November 2018 в 22:02

2 ответа

$ 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
1
ответ дан 7 December 2019 в 15:12

Это может быть задано сценарием в 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.

0
ответ дан 7 December 2019 в 15:12

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

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