V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mantis
V2EX  ›  程序员

编写一个 shell 脚本,将 2 个文件的差集,输出到一个新文件

  •  
  •   mantis · 2022-08-10 22:56:56 +08:00 · 2714 次点击
    这是一个创建于 617 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如:有如下 2 个文件:

    $ cat a.txt
    1111111
    2222222
    3333333
    7777777
    9999999
    
    $ cat b.txt
    1111111
    2222222
    3333333
    4444444
    7777777
    5555555
    6666666
    8888888
    9999999
    

    将 2 个文件的差级输出到文件 c.txt

    $ cat c.txt
    4444444
    5555555
    6666666
    8888888
    

    请问如何实现?

    27 条回复    2022-08-11 16:40:37 +08:00
    Yang2635
        1
    Yang2635  
       2022-08-10 23:10:19 +08:00 via Android   ❤️ 2
    sort a.txt b.txt | uniq -u
    yinyu
        2
    yinyu  
       2022-08-10 23:10:23 +08:00
    两个都要遍历一遍,然后再对方里面 grep ,然后 wc 看看行数,如果等于零就说对方没有,就写到 c 里面,可能大佬们,有更好的办法吧。
    Yang2635
        3
    Yang2635  
       2022-08-10 23:10:43 +08:00 via Android
    comm -13 a.txt b.txt
    nuk
        4
    nuk  
       2022-08-10 23:10:45 +08:00
    可以用 comm ,但是要求输入是已经排序好的
    Privileges
        5
    Privileges  
       2022-08-10 23:11:20 +08:00
    grep -wvf a.txt b.txt
    id4alex
        6
    id4alex  
       2022-08-10 23:13:05 +08:00   ❤️ 1
    cat a.txt b.txt | sort | uniq > tmp.txt
    grep -vf a.txt tmp.txt > c.txt
    grep -vf b.txt tmp.txt >> c.txt
    weiiai
        7
    weiiai  
       2022-08-10 23:13:53 +08:00   ❤️ 1
    diff -a a.txt b.txt | grep ">" | sed 's/> //'
    mantis
        8
    mantis  
    OP
       2022-08-10 23:14:01 +08:00
    需要输出到一个新文件,需要完整的 shell 脚本,不是简单的命令,谢谢大家。
    id4alex
        9
    id4alex  
       2022-08-10 23:14:21 +08:00
    又从各位老哥这里学习到了 shell 技巧
    Yang2635
        10
    Yang2635  
       2022-08-10 23:15:55 +08:00 via Android
    @mantis 重定向">"一下就行了
    wbd31
        11
    wbd31  
       2022-08-10 23:21:31 +08:00
    diff a.txt b.txt | awk '{if($0~/^[<>]/)print substr($0, 3)}'
    PMR
        12
    PMR  
       2022-08-10 23:24:11 +08:00 via Android
    这问题前几天有人问过



    shell 脚本不就是塞命令进去? 还能编译个二进制不成?
    xiadong1994
        13
    xiadong1994  
       2022-08-11 01:53:19 +08:00
    @PMR #12 把一个二进制 base64 之后用 shell 写入 file system 再运行(

    我真的见过这样的……
    kkeep
        14
    kkeep  
       2022-08-11 01:55:05 +08:00 via Android
    @weiiai 你这个需要 sort
    codingBug
        15
    codingBug  
       2022-08-11 03:19:37 +08:00
    善用[搜索引擎]( https://unix.stackexchange.com/questions/428419/how-to-write-the-difference-between-two-files-into-a-file)

    不知道是不是你要的效果

    `diff a.txt b.txt|grep ">"| cut -c 3- > c.txt`
    aaa5838769
        16
    aaa5838769  
       2022-08-11 08:00:57 +08:00
    上面各个大佬都已经给完整的命令,脚本就是有各种命令组成的,你自己粘贴进去就可以用了。
    masker
        17
    masker  
       2022-08-11 09:03:50 +08:00 via Android   ❤️ 13
    伸手党的胜利:大佬已经给出了答案,还嫌大佬不够手把手教
    qooweds
        18
    qooweds  
       2022-08-11 09:06:37 +08:00
    又到了学习 shell 花式技巧的时间啦,期待更多新命令
    knightdf
        19
    knightdf  
       2022-08-11 09:26:30 +08:00
    comm -3 <(sort a.txt) <(sort b.txt)
    cwcc
        20
    cwcc  
       2022-08-11 09:33:30 +08:00
    借个楼问下,如果是那种.patch 的文件,怎么应用到文件上呢?还有.patch 文件是怎么来的
    oneisall8955
        21
    oneisall8955  
       2022-08-11 09:53:36 +08:00 via Android   ❤️ 3
    请善用搜索引擎,端饭人前还嚷嚷要喂吗?
    ruanimal
        22
    ruanimal  
       2022-08-11 11:51:15 +08:00
    @cwcc patch some.file xxx.patch
    yolee599
        23
    yolee599  
       2022-08-11 12:04:51 +08:00
    @cwcc #20 善用搜索系统,.patch 文件可以通过 git 生成和应用
    try4times
        24
    try4times  
       2022-08-11 13:05:21 +08:00
    某公司在赛码上的笔试题?
    bmsac0001
        25
    bmsac0001  
       2022-08-11 13:18:13 +08:00 via Android
    为什么不用 diff
    maxbon
        26
    maxbon  
       2022-08-11 15:30:53 +08:00
    先排序再用 diff 呀
    Acoolda
        27
    Acoolda  
       2022-08-11 16:40:37 +08:00
    我推荐大家每日一问,大佬收获指导众生的满足感,我们收获知识。两全其美.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   993 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:59 · PVG 03:59 · LAX 12:59 · JFK 15:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.