bash - 根据匹配多个值之一的列提取行

标签 bash awk filter grep col

我有一些包含以下数据的文件:

 160-68 160 68 B-A 0011 3.80247
 160-68 160 68 B-A 0022 3.73454
 160-69 160 69 B-A 0088 2.76641
 160-69 160 69 B-A 0022 3.54446
 160-69 160 69 B-A 0088 4.24609
 160-69 160 69 B-A 0011 3.97644
 160-69 160 69 B-A 0021 1.82292

我需要在第 5 列的数组中提取具有任何值(可以为负数:ex -12222)的行。

[0088, 0021] 的输出:

160-69 160 69 B-A 0088 2.76641
160-69 160 69 B-A 0088 4.24609
160-69 160 69 B-A 0021 1.82292

我目前正在使用 Ruby 执行此操作,但有没有一种方法可以使用 Bash 更快地执行此操作?

谢谢。

最佳答案

bash 不太可能比 ruby​​ 快:bash 通常很慢。我会选择 awk 或 perl

awk -v values="0088 0021" '
    BEGIN {
        n = split(values, a)
        for (i=1; i<=n; i++) b[a[i]]=1
    }
    $5 in b
' file
perl -ane 'BEGIN {%v = ("0088"=>1, "0021"=>1)} print if $v{$F[4]}' file

关于bash - 根据匹配多个值之一的列提取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107947/

相关文章:

macos - OSX 上的 bash : How to determine if network file (AFP) is in use?

xml - 替换 XML 文件中的动态内容

bash - 使用 awk 的最近邻居

Perl 脚本引发 awk 命令的语法错误

ios - 在过滤器选择上存储数据

linux - 将错误重定向到一个文件,将标准输出重定向到另一个函数,然后再重定向到另一个文件

bash - 从导出变量的源脚本中退出

bash - 仅当重定向到管道或文件时 awk 才没有输出

javascript - 使用 jquery 添加多个过滤器

javascript - 根据其中一个键删除重复的对象