【问题标题】:grep and awk to ignore special chars and spaces and search in 2 filesgrep 和 awk 忽略特殊字符和空格并在 2 个文件中搜索
【发布时间】:2020-08-10 08:48:07
【问题描述】:

我有 2 个列表 ...

a.txt:

I am a bad wolf (2015)  
you are a bad wolf (2020)  
we all - are bad wolf (1123)  
you are a bad wolf 2 (2021)

b.txt:

I am - a bad wolf (2015)  
you are abad wolf (2019)

我希望输出文件 c.c 仅包含 a.txt 中不存在于 b.txt 中的唯一行,并且还忽略括号中的数字。

c.txt:

we all - are bad wolf (1123)  
you are a bad wolf 2 (2021)  

我试过grep -ixvf a.txt b.txt > c.txt

但它不会忽略那些空格和特殊字符..

我猜这需要某种 sed(删除特殊字符)| grep ...

任何帮助都可以得到...

【问题讨论】:

  • 请务必将您的示例/代码包装在 CODE TAGS 中。
  • 如果您是guessing this will require some sort of sed,那么用 sed 标记您的问题是有意义的。实际上,正确的解决方案不会使用 sed 或 grep,因为您不会尝试使用 s/old/new/(sed 是正确的工具)或 g/re/p(grep 是正确的工具),它会使用awk 或等效的,所以我用 awk 替换 grep 标记。

标签: awk


【解决方案1】:

假设您所说的“特殊字符”是指通常不被视为单词组成的任何内容,即字母数字或下划线:

$ cat tst.awk
{
    key = $0
    gsub(/[^[:alnum:]_]|\([^()]+)/,"",key)
}
NR==FNR {
    a[key] = (key in a ? a[key] ORS : "") $0
    next
}
!(key in a)

.

$ awk -f tst.awk b.txt a.txt
we all - are bad wolf (1123)
you are a bad wolf 2 (2021)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多