Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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 使用awk sed命令和while循环从第二个文件中删除条目_Linux_Bash_Awk_Sed_While Loop_Regex - Fatal编程技术网

Linux 使用awk sed命令和while循环从第二个文件中删除条目

Linux 使用awk sed命令和while循环从第二个文件中删除条目,linux,bash,awk,sed,while-loop,regex,Linux,Bash,Awk,Sed,While Loop,Regex,我有两个输出文件: 文件A包含70000多个唯一条目 FILE-B包含我需要从FILE-B中删除的唯一列表 文件A: 文件B内容: TOM ELI 我想从文件A中删除文件B中列出的任何内容 文件C(结果文件): 我假设我需要一个,而r代表I语句。有人能帮我吗? 我需要cat并读取文件-A,对于文件-B中的每一行,我需要将其从文件-A中删除 我应该使用什么命令?您可以使用grep-v-f: grep -xFvf FILE-B FILE-A ACK AILEY BORG ROSE 您不需要a

我有两个输出文件:

  • 文件A包含70000多个唯一条目
  • FILE-B包含我需要从FILE-B中删除的唯一列表
  • 文件A:

    文件B内容:

     TOM
     ELI
    
    我想从文件A中删除文件B中列出的任何内容

    文件C(结果文件):

    我假设我需要一个
    ,而r代表I
    语句。有人能帮我吗? 我需要
    cat
    并读取文件-A,对于文件-B中的每一行,我需要将其从文件-A中删除


    我应该使用什么命令?

    您可以使用
    grep-v-f

    grep -xFvf FILE-B FILE-A
    ACK
    AILEY
    BORG
    ROSE
    

    您不需要
    awk
    sed
    或循环。您只需要
    grep

    fgrep -vxf FILE-B FILE-A
    
    请注意使用
    -x
    来精确匹配条目

    输出:

    JACK
    AILEY
    BORG
    ROSE
    

    如果从排序输入开始,此任务的工具是
    comm

    comm -23 FILE-A FILE-B
    
    选项参数意味着

    -2              suppress lines unique to FILE-B
    -3              suppress lines that appear in both files
    
    如果最初没有排序,可以执行以下操作

    comm -23 <(sort FILE-A) <(sort FILE-B)
    

    comm-23您不需要任何循环,单个
    awk
    sed
    命令就足够了:

    awk:

    sed:

    注:

  • 虽然sed版本适用于显示的数据,但它不会处理FILE-B中任何可以解释为regex模式的文本
  • awk解决方案将文件B完全读取到内存中。它没有像
    sed
    解决方案那样解释文本的限制

  • 您想要两个文件之间的唯一行集吗?请参见(搜索“抑制重复行”)。这是一个单线awk解决方案。此外,这个Q最好的网站是。Shell编程的东西很容易在SO上的混乱中丢失。您可能还希望
    -F
    将FILE-B中的行解释为固定字符串,而不是正则表达式。@PeterCordes
    fgrep
    总是将模式解释为普通字符串,而不是正则表达式。它与
    grep-F
    完全相同。不推荐使用
    fgrep
    调用。有关详细信息,请参见
    man grep
    。真的吗?嗯,我的*BSD机器似乎都没有收到那个备忘录。:)说真的,
    fgrep
    已经使用了40多年,你真的认为它会因为GNU的某个人希望它这样做而消失吗?它不会反过来工作
    grep-F
    在任何地方都可用,而且在任何地方都不推荐使用。所有系统都有
    grep-F
    ,并且将持续很长时间,但是
    fgrep
    ,没有
    grep-F
    显然是最安全的选择。
    awk
    解决方案将
    FILE-B
    完全读取在内存中。
    sed
    解决方案假设一个
    sed
    可以从
    stdin
    读取脚本(即,只有GNU
    sed
    ,AFAIK)。只需注意:尽管
    sed
    版本适用于显示的数据,它不会处理文件B中任何可以解释为正则表达式模式的文本,
    awk
    版本可以解决这样的问题。@Peter.O我想知道谁会首先注意到这一点。这是
    sed
    解决方案的一个有效且严重的陷阱。不过,可以通过对文件B进行消毒来克服这一问题。不管怎样,我加了你的便条。thnks@SatoKatsura我也加了你的便条。thnks
    -2              suppress lines unique to FILE-B
    -3              suppress lines that appear in both files
    
    comm -23 <(sort FILE-A) <(sort FILE-B)
    
    awk 'FNR==NR {a[$0];next} !($0 in a)' FILE-B FILE-A >FILE-C
    
    sed "s=^=/^=;s=$=$/d=" FILE-B | sed -f- FILE-A >FILE-C