比较文件并更新匹配的字符串 awk/sed/diff/grep/csv



我需要比较 2 个 csv 文件并对第二列进行修改。我写出了我想要如何实现这一点的逻辑,但是,它似乎比我想要的更困惑线程,所以我只写出示例。

任何帮助将不胜感激。提前谢谢。

文件1

user1,distinguishedName1
user2,distinguishedName2
user3,distinguishedName3
user4,distinguishedName4
user5,distinguishedName5

文件2

user1,distinguishedName1
user3,distinguishedName13
user5,distinguishedName12
user6,distinguishedName4

期望的结果:

user1,distinguishedName1
user2,distinguishedName2
user3,distinguishedName13
user4,distinguishedName4
user5,distinguishedName12
user6,distinguishedName4

使用join命令与awk命令结合使用的解决方案:

join -t',' -j1 -a1 -a2  file1 file2 | awk -F',' '{if(NF==3) $0=$1FS$3}1'

输出:

user1,distinguishedName1
user2,distinguishedName2
user3,distinguishedName13
user4,distinguishedName4
user5,distinguishedName12
user6,distinguishedName4

解释

-- 对于连接命令:

-t',' - 定义字段分隔符

-j1 - 告诉加入第一个字段1

-a FILENUM - 打印来自文件 FILENUM 的不可配对行,其中 FILENUM 为 1 或 2,对应于 FILE1 或 FILE2


-- 对于 awk 命令:

NF - 包含字段总数

FS - 字段分隔符(即 , (

if(NF==3) $0=$1FS$3 - 条件,检查是否有补码第三个字段(由于将文件与公共的第一个字段连接在一起(来执行替换

https://linux.die.net/man/1/join

awk救援!

awk -F, '!a[$1]++' file2 file1
user1,distinguishedName1
user3,distinguishedName13
user5,distinguishedName12
user6,distinguishedName4
user2,distinguishedName2
user4,distinguishedName4

此顺序基于File2和File1记录顺序,如果要排序顺序,只需管道排序即可

awk ... | sort

最新更新