使用一对一连接合并表达式

使用一对一连接合并表达式

我有两个文本表如下:
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 将抛出错误。

相关内容