使用unix命令或shell脚本

时间:2018-06-15 09:43:41

标签: shell unix

我是Unix和shell脚本的新手。我试图使用Unix命令找到2 .csv文件之间的差异。在某些条件的基础上,我必须找到差异。

  1. 更新到条目,即file1中的任何行(唯一ID是员工ID)存在于file2中,但另一列的值不同。它被视为更新。在这种情况下,我需要来自file2的条目
  2. 如果文件2中存在条目而文件中没有条目,则视为新员工的添加。我需要来自file2的那一行。
  3. 如果file1中存在条目而不存在于file2中,则将其视为删除员工。我需要来自file1的那一行。
  4. 我可以使用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”值,这样就可以了。

2 个答案:

答案 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