我是Unix和shell脚本的新手。我试图使用Unix命令找到2 .csv文件之间的差异。在某些条件的基础上,我必须找到差异。
我可以使用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中的条目
P.S。这两个文件可以包含上面提到的所有3种情况。我需要输出两个csv文件。一个用于更新/新记录,另一个用于已删除的记录。
File1.csv
行|员工_ID |薪水|指定1 |约翰| 2000 |职员 2 |史密斯| 3000 |主管3 |珍妮| 1000 |实习生4 |维基| 5000 |经理
File2.csv
行|员工_ID |薪水|指定1 |约翰| 2000 |职员 2 |史密斯| 4000 |高级主管4 | Vicky | 5000 |经理 5 |詹姆斯| 5000 |审计员
在上面的2个文件中 第2行中的第2行是更新,第5行是新条目。它们中的任何一个都可以合并为单个文件
Update_new.csv
2 |史密斯| 4000 |高级主管
5 |詹姆斯| 5000 |审计员
已删除的条目是file1.csv中的第3行,它在file2.csv中不存在,以保存在单独的文件中 deleted.csv
3 |珍妮| 1000 |实习生
即使我能够将所有两个文件添加到单个文件中,还有一个额外的coloum指定“UPDATED”,“NEW”,“DELETED”值,这样就可以了。
答案 0 :(得分:0)
您可以使用diff本身轻松完成此操作。
我用过的测试文件
1.csv:
a,1
b,2
d,3
f,5
2.csv:
b,2
c,6
d,3
f,4
这是diff
的输出$ diff 1.csv 2.csv
1d0
< a,1
2a2
> c,6
4c4
< f,5
---
> f,4
您可以搜索字母&#39; a&#39;&#39; d&#39;&#39; c&#39; 以获取添加,删除和更改的行。以下是如何获取添加行的示例
$ diff 1.csv 2.csv | grep -A1 '^[0-9]*a'
2a2
> c,6
您可以使用其他sed命令正确提取csv
$ diff 1.csv 2.csv | grep -A1 '^[0-9]*a' | sed -n '/^[><]/s/[><] \(.*\)$/\1/p'
c,6
您可以轻松地更改grep和sed命令,以便以您想要的任何方式进行格式化。
答案 1 :(得分:0)
使用awk:
$ awk -F\| '
NR==FNR { # store first file to a hash
a[$1]=$0 # $1 is the key
next
}
($1 in a) { # process second file. If key in a
if(a[$1]!=$0) # but data has changed
print > "updated" # output to updated file
delete a[$1] # delete entry from hash
next # skip to next record in file
}
{
print > "updated" # if $1 not in a, it is new, output
}
END { # after file 2
for(i in a) # print all leftovers from file 1
print a[i] > "deleted" # output to deleted
}' 1.csv 2.csv
结果:
$ cat deleted
3|Jenny|1000|Intern
$ cat updated
2|Smith|4000|Senior Supervisor
5|James|5000|Auditor