有没有更快的方法在linux中获取这个输出文件

有没有更快的方法在linux中获取这个输出文件
cat file_1

my colour is red
my rose is red
my colour is blue
my rose id blue

cat file_2 
red
blue

cat output_file should be
my colour is red
my colour is blue

我在这里使用

cat file_2 | while read line;do cat file_1 | grep "$line" | head -1;done

在这里,我试图获取包含pattern "red" and "blue"存在于中的最上面的行file_2

还有其他方法吗,,as fast as possiblewhile 循环需要时间

答案1

您可以使用while构造来循环 from 的模式file2,然后使用-m 1withgrep在第一次匹配后停止file1

while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
  • -F从字面上对待模式
  • -m 1使grep第一场比赛后退出

Shell 循环通常效率不高,但由于模式列表很小,因此在这种情况下是可用的。

更快的替代方案, xargs:

xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1

使用更多并行进程 ( -P) 以获得更多模式。

例子:

% while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
my colour is red
my colour is blue

% xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1
my colour is blue
my colour is red

答案2

要打印 file_1 中与 file_2 中的行匹配的第一行:

$ awk 'FNR==NR{a[$0];next} {for (line in a) if ($0~line) {print; delete a[line]}}' file_2 file_1
my colour is red
my colour is blue

这种方法只读取每个文件一次。

怎么运行的

  • FNR==NR{a[$0];next}

    这会将 file_2 中的每一行保存为关联数组中的键a

  • for (line in a) if ($0~line) {print; delete a[line]}

    对于 file_1 中的每一行,我们检查它是否与 array 中的键匹配a。如果是,我们打印该行并删除该密钥。

相关内容