Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
Bash 有没有更快的方法在另一个文件中查找一个文件的内容?_Bash_Unix_Scripting - Fatal编程技术网

Bash 有没有更快的方法在另一个文件中查找一个文件的内容?

Bash 有没有更快的方法在另一个文件中查找一个文件的内容?,bash,unix,scripting,Bash,Unix,Scripting,我有两个文件 文件f1(在一列中仅包含约10000个唯一行) 文件f2(有多列和大约300000行) 文件f2的第一列具有与文件f1相同的元素。我想grep这些公共元素(全部10000个)以及file2中其他列的内容 到目前为止,我已经试过了 grep -f f1 f2 and also grep -F -f f1 f2 但这两个都给了我最终输出(10000+)中的一些额外行。这两个文件的第一列都有一些内容,它们之间用“/”分隔,这可能需要更多的文本操作 如。 第1列 a/b/c e

我有两个文件

文件f1(在一列中仅包含约10000个唯一行)

文件f2(有多列和大约300000行)
文件f2的第一列具有与文件f1相同的元素。我想grep这些公共元素(全部10000个)以及file2中其他列的内容

到目前为止,我已经试过了

grep -f f1 f2  
and also 
grep -F -f f1 f2 
但这两个都给了我最终输出(10000+)中的一些额外行。这两个文件的第一列都有一些内容,它们之间用“/”分隔,这可能需要更多的文本操作 如。 第1列
a/b/c
e/f/g

x/y

grep-f
是一个良好的开端,但存在两个问题:

  • 根据数据的不同,确保文件2中的第1列完全匹配可能会很麻烦(不仅部分匹配,而且没有其他列)示例:

    • 对于文件
      f1
      =
      line1
      f2
      =
      line100 a b
      ,由于grep在
      line100
      中找到字符串
      line1
      ,因此会出现误报。这可以通过grep的
      -w
      选项来防止
    • 对于文件
      f1
      =
      line1
      f2
      =
      line2 a line1
      您会得到一个假阳性,因为grep在第三列中找到了根本不应该搜索的字符串
      line1
      。使用
      grep
      很难防止此类错误。一种安全的方法是生成扩展正则表达式模式(类似于
      grep-Ef
      grep-F-w-F f1-f2
      grep-F-e'^\w\w*'-F f1-f2
      ?有什么额外的内容(
      A/b/c
      )与
      f1
      f2
      不匹配?请在问题中添加带有字段分隔符的文件f2示例(无注释)。是否仅从f2中提取第1列中具有f1中存在的值的行?我希望输出类似(仅提取第1列中的公共元素,以及文件2中第2列和第3列的内容)line1 x y line 2 e fIn,在这种情况下,
      grep-F-e'^line'-F f1 f2
      。(否则,
      awk
      始终可用)张贴每个文件中好的行的文本示例,以及每个文件中的分层内容(每个文件大约5行)
      grep -f f1 f2  
      and also 
      grep -F -f f1 f2 
      
      join <(sort f1) (sort f2)
      
      hsort() { IFS= read -r header; printf %s\\n "$header"; sort; }
      join --header <(hsort < f1) <(hsort < f2)