【问题标题】:shell - compare files and update matching string awk/sed/diff/grep/csvshell - 比较文件并更新匹配字符串 awk/sed/diff/grep/csv
【发布时间】:2017-08-26 06:22:11
【问题描述】:

我需要比较 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

【问题讨论】:

  • 到目前为止你实现了什么?
  • 所以我最终做了什么:cat file1 | sed 's/,.*$//' > file1a cat file2 | sed 's/,.*$//' > file2a grep -Fxf file1a file2a > file.match var1=$(cat file1) while read p;做 echo $p var1=$(echo "$var1" | sed "s/$p,.*$//") 完成 file1modified

标签: shell csv awk sed diff


【解决方案1】:

使用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

【讨论】:

    【解决方案2】:

    awk 来救援!

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

    此顺序基于 file2 和 file1 记录顺序,如果您想要排序顺序只需管道排序

    awk ... | sort
    

    【讨论】:

      最近更新 更多