对比两列数据
功能:读取文件、处理两列 ID 数据以及输出结果并统计总计数量
示例文件
$ cat input.txt
aaa bbb
bbb ccc
ccc hhh
ddd kkk
eee zzz
fff
ggg
脚本
- python
- go
# 文件: process_ids.py
# 从文件中读取输入数据
with open("input.txt", "r") as file:
data = file.read()
# 将数据处理为两列 ID 的列表
column1, column2 = [], [] # 初始化两个列表
for line in data.strip().split('\n'): # 去掉开头和结尾的空行,并逐行处理
items = line.split() # 按空格分割每行数据
column1.append(items[0]) # 第一列的数据添加到 column1
if len(items) > 1: # 如果有第二列
column2.append(items[1]) # 第二列的数据添加到 column2
# 计算只在第一列但不在第二列中的 ID
only_in_column1 = set(column1) - set(column2)
# 计算只在第二列但不在第一列中的 ID
only_in_column2 = set(column2) - set(column1)
# 计算两列中重复的 ID
duplicates = set(column1) & set(column2)
# 输出结果并添加提示性文字
print("只在第一列但不在第二列中的 ID(总计 {} 个):".format(len(only_in_column1)))
print("\n".join(only_in_column1))
print("\n只在第二列但不在第一列中的 ID(总计 {} 个):".format(len(only_in_column2)))
print("\n".join(only_in_column2))
print("\n两列中重复的 ID(总计 {} 个):".format(len(duplicates)))
print("\n".join(duplicates))
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
// 打开输入文件
file, err := os.Open("input.txt")
if err != nil {
fmt.Println("无法打开文件:", err)
return
}
defer file.Close()
// 定义两个切片用于存储两列数据
var column1, column2 []string
// 逐行读取文件内容
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
// 按空格分割每行内容
parts := strings.Fields(line)
if len(parts) > 0 {
column1 = append(column1, parts[0]) // 第一列
}
if len(parts) > 1 {
column2 = append(column2, parts[1]) // 第二列
}
}
if err := scanner.Err(); err != nil {
fmt.Println("读取文件时出错:", err)
return
}
// 将切片转换为集合(使用 map 模拟集合)
set1 := make(map[string]struct{})
set2 := make(map[string]struct{})
for _, id := range column1 {
set1[id] = struct{}{}
}
for _, id := range column2 {
set2[id] = struct{}{}
}
// 计算只在第一列但不在第二列中的 ID
onlyInColumn1 := make([]string, 0)
for id := range set1 {
if _, exists := set2[id]; !exists {
onlyInColumn1 = append(onlyInColumn1, id)
}
}
// 计算只在第二列但不在第一列中的 ID
onlyInColumn2 := make([]string, 0)
for id := range set2 {
if _, exists := set1[id]; !exists {
onlyInColumn2 = append(onlyInColumn2, id)
}
}
// 计算两列中重复的 ID
duplicates := make([]string, 0)
for id := range set1 {
if _, exists := set2[id]; exists {
duplicates = append(duplicates, id)
}
}
// 输出结果
fmt.Printf("只在第一列但不在第二列中的 ID(总计 %d 个):\n", len(onlyInColumn1))
for _, id := range onlyInColumn1 {
fmt.Println(id)
}
fmt.Printf("\n只在第二列但不在第一列中的 ID(总计 %d 个):\n", len(onlyInColumn2))
for _, id := range onlyInColumn2 {
fmt.Println(id)
}
fmt.Printf("\n两列中重复的 ID(总计 %d 个):\n", len(duplicates))
for _, id := range duplicates {
fmt.Println(id)
}
}
输出
只在第一列但不在第二列中的 ID(总计 5 个):
aaa
ggg
fff
ddd
eee
只在第二列但不在第一列中的 ID(总计 3 个):
hhh
zzz
kkk
两列中重复的 ID(总计 2 个):
bbb
ccc