【问题标题】:Remove lines from a text file that contains multiple string patterns from another file in linux [closed]从包含来自Linux中另一个文件的多个字符串模式的文本文件中删除行[关闭]
【发布时间】:2019-11-21 12:27:42
【问题描述】:

目标是根据 file1 中的前 3 列值删除 file2 中的重复行。

尝试使用此帖子中的修改解决方案(使用单字符串模式)但无法使其工作..

remove all lines in a file containing a string from another file

输入文件 1 是制表符分隔的(5 列 ABCDE):

A   B    C    D    E
a   b    c    d    x
aa  bb   cc   dd   xy
aaa bbb  ccc  ddd  xyz
    bbbb cccc dddd xxyz

输入文件2:

123|234|aa|ur29842|b|c|234|567
123|234|a|ur29|b|c|234|567
123|234|aa|ur290792|bb|cc|234|567
123|234|aa|ur2909842|bb|ccc|234|567
123|234|aaa|ur29042842|bb|cc|234|567
123|234|aaa|ur2922|bbb|ccc|234|567
123|234|N.A.|ur2922|bbbb|cccc|234|567
123|234|N.A.|ur2922|bbb|cccc|234|567

输出:

从 file2 中删除任何具有 *|*|a|*|b|c|*|**|*|aa|*|bb|cc|*|**|*|aaa|*|bbb|ccc|*|**|*|N.A.|*|bbbb|cccc|*|* 等模式的行

*|*|N.A.|*|bbbb|cccc|*|* 在列表中的原因是因为 file1 中的最后一行 " bbbb cccc dddd xxyz" 第一个元素为空(制表符分隔)

file2 中的任何字段都可以是 N.A..

123|234|aa|ur29842|b|c|234|567
123|234|aa|ur2909842|bb|ccc|234|567
123|234|aaa|ur29042842|bb|cc|234|567
123|234|N.A.|ur2922|bbb|cccc|234|567
awk 'FNR==NR{a[$1 FS $2 FS $3];next} !(($3 OFS $5 OFS $6) in a)' file1 FS="|" files

不捕获带有 N.A. 的模式,但也不想删除带有 N.A. 的所有行。

【问题讨论】:

  • @td17:您修改后的解决方案看起来如何?
  • 请显示相关代码并说明确切的问题或错误。仅有描述是不够的。另见How to create a Minimal, Complete, and Verifiable example
  • 如果您的真实输入/输出文件的数据行之间没有空行,那么 edit 您的问题,因此您提供的样本与您的真实数据的格式相匹配。
  • @EdMorton 空行只是为了让输入/输出看起来更干净,尽管这很好。
  • 如果有人想查看另一个问题以获取背景信息,但请确保您当前的问题独立存在,这很好。我不知道你想做什么,但也许其他人会有更多的运气。

标签: linux bash awk sed


【解决方案1】:
$ cat tst.awk
BEGIN { FS = "[\t|]" }
NR==FNR {
    for (i=1; i<=3; i++) {
        if ($i == "") {
            $i = "N.A."
        }
    }
    a[$1 OFS $2 OFS $3]
    next
}
!(($3 OFS $5 OFS $6) in a)

$ awk -f tst.awk file1 file2
123|234|aa|ur29842|b|c|234|567
123|234|aa|ur2909842|bb|ccc|234|567
123|234|aaa|ur29042842|bb|cc|234|567
123|234|N.A.|ur2922|bbb|cccc|234|567

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多