gpt4 book ai didi

linux - 从 Linux 中的另一个文件中删除包含多个字符串模式的文本文件中的行

转载 作者:太空宇宙 更新时间:2023-11-04 06:05:36 25 4
gpt4 key购买 nike

目标是根据 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. 的所有行。

最佳答案

$ 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

关于linux - 从 Linux 中的另一个文件中删除包含多个字符串模式的文本文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58975057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com