Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从linux中的另一个文件中删除包含多个字符串模式的文本文件中的行_Linux_Bash_Awk_Sed - Fatal编程技术网

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

从linux中的另一个文件中删除包含多个字符串模式的文本文件中的行,linux,bash,awk,sed,Linux,Bash,Awk,Sed,目标是基于file1中的前3列值删除file2中的重复行 尝试使用此帖子中的修改后的解决方案(使用单字符串模式),但无法使其工作 输入文件1用制表符分隔(5列ABCDE): 输入文件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|c

目标是基于file1中的前3列值删除file2中的重复行

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

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

输入文件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
输出:

从文件2中删除任何具有类似
*.*.*a*.*.*.*.*.*.
*.*.*.*aa*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
.*.*.*.*

*|*| N.A.|*| bbbb | cccc |*
之所以出现在列表中,是因为文件1
中的最后一行“bbbbbb cccc ddd xxyz”
第一个元素为空(制表符分开)

文件2中的任何字段都可以为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
不捕获带有N.A.的图案,但也不想删除带有N.A.的所有行。

$cat tst.awk
$ 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
开始{FS=“[\t|]” NR==FNR{
对于(i=1;i@td17:修改后的解决方案是什么样子的?请显示相关代码并说明确切的问题或错误。仅提供说明是不够的。另请参阅。如果实际输入/输出文件的数据行之间没有空行,请回答您的问题,以便您提供的示例与实际数据的格式相匹配。@EdMorton blank lines只是为了让输入/输出看起来更干净,尽管这很有意义。如果有人想去看,可以参考另一个问题作为背景信息,但请确保你当前的问题是独立的。我不知道你想做什么,但也许其他人会更幸运。
awk 'FNR==NR{a[$1 FS $2 FS $3];next} !(($3 OFS $5 OFS $6) in a)' file1 FS="|" files
$ 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