【问题标题】:Remove data in file1 against file2针对 file2 删除 file1 中的数据
【发布时间】:2019-07-20 03:43:42
【问题描述】:

这可能是 StackOverflow 上给出的最糟糕的例子,但我的目的是删除 File1 中针对 File2 的所有内容。同时忽略大小写敏感并匹配整行。例如,Cats@123:bob 将从 File2 中删除,因为 Cat 出现在 File1 中。因此,无论是否区分大小写,如果找到匹配的单词,它应该删除整行。

输入(文件1):

Cat
Dog
Horse
Wheel

主文件(文件2)

Cats@123:bob
dog@1:truth
Horse-1:fairytale
Wheel:tremendous
Divination:maximus

期望的输出

Divination:maximus

如输出所示,应该只输出“Divination:maximus”,因为在 File1 中没有找到匹配的单词。我更喜欢使用 Sed 或 Awk,因为我使用 Cygwin。但是欢迎任何建议,我可以回答您可能遇到的所有问题,谢谢。

到目前为止,这是我尝试过的方法,但不幸的是它不起作用,因为我的输出不正确。除此之外,只是输出了错误的行。我相当缺乏经验,所以我不知道如何根据下面的这种语法进行开发,也许它与手头的工作完全无关。

grep -avf file1.txt file2.txt > output.txt

【问题讨论】:

    标签: unix awk sed cygwin


    【解决方案1】:

    grep 命令可以为您做到这一点:

    grep -v -i -f file1 file2
    
    • -f file1 告诉grep 使用file1 中的模式
    • -i 标志表示不区分大小写
    • -v 标志意味着搜索不包含这些模式的行

    【讨论】:

    • 您好,感谢您的回复,输出确实是正确的。但我注意到我必须手动将文件切换到 Unix EOL。有没有办法在语法/代码/命令或任何单词中实现这一点:D 更新:别担心,我想我想通了,感谢您的帮助,非常感谢。再次感谢 Ed Morton 的持续帮助 :)
    • 我不明白你的评论。也许你可以用不同的方式向我解释?顺便说一句,我运行的是Linux,所以我对Windows的行尾问题了解不多;但请解释一下。
    • 所以当我最初执行您的命令时,输出不正确。我在 Notepad++ 中检查了行尾,它默认为 Windows。我将它切换到 Unix,重新运行命令,输出很完美。我很确定:需要实现 tr -d '\r' 以使 Unix EOL 默认(这不是一个大问题 AFAIK)。
    • @StackStackAndStack 请参阅stackoverflow.com/a/45772568/1745001 了解如何真正处理 DOS 行尾。不涉及tr
    • dos2unix aka d2u 命令将 windows 行尾转换为 Unix 行尾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2019-01-31
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多