我有两个文本表如下:
file1.txt
1 A a
2 B b
3 C c
4 D d
文件2.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
$ 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
答案2
这可以用 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
你可以使用 shell 重定向运算符创建 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 将抛出错误。