【发布时间】:2018-06-15 09:43:41
【问题描述】:
我是 Unix 和 shell 脚本的新手。我正在尝试使用 Unix 命令查找 2 个 .csv 文件之间的差异。有一些条件,我必须根据这些条件找到差异。
- 更新到一个条目,即 file1 中的任何行(唯一 id 是员工 id)都存在于 file2 中,但另一列的值不同。它被视为更新。在这种情况下,我需要来自 file2 的条目
- 如果文件2中存在条目而文件中不存在,则认为添加了新员工。我需要 file2 中的那一行。
- 如果文件1中存在条目,文件2中不存在,则认为删除了员工。我需要 file1 中的那一行。
我可以使用comm -23 sorted_file_2.csv sorted_file_1.csv > updates.csv 找到更新和新记录,但找不到已删除的条目。
我已经使用以下命令检查了解决方案
grep -v -x -f sorted_file_2.csv sorted_file_1.csv > deleted.csv
awk 'NR==FNR{a[$0]=1;next}!a[$0]' sorted_file_2.csv sorted_file_1.csv > deleted.csv
diff sorted_file_1.csv sorted_file_2.csv > deleted.csv
上面的命令总是给我更新和删除的条目。我正在寻找 file1 中不在 file2 中的唯一条目
附:这两个文件可以包含上述所有 3 种情况。我需要在两个 csv 文件中输出。一个用于更新/新记录,另一个用于已删除记录。
文件1.csv
行|Employee_ID|薪水|职称 1|John|2000|文员 2|Smith|3000|主管 3|Jenny|1000|实习生 4|Vicky|5000|经理
文件2.csv
行|Employee_ID|薪水|职称 1|John|2000|文员 2|Smith|4000|高级主管 4|Vicky|5000|经理 5|詹姆斯|5000|审计员
在以上2个文件中 file2 中的第 2 行是更新,第 5 行是新条目。它们都可以合并到单个文件中作为
Update_new.csv
2|史密斯|4000|高级主管
5|詹姆斯|5000|审计员
删除的条目是 file1.csv 中的第 3 行,而 file2.csv 中不存在该条目,要保存在单独的文件中 删除的.csv
3|珍妮|1000|实习生
即使我能够将所有两个文件添加到单个文件中,并使用一个额外的列指定 "UPDATED","NEW","DELETED" 值也可以。
【问题讨论】:
-
为什么不使用
diff? -
我只需要 csv 格式的结果,以便我可以被 java 应用程序进一步读取。需要进一步更新、添加和删除来自其他应用程序的条目
-
发布具有预期输出的两个文件的样本。