linux - Grep csv 与来自另一个 csv 的参数

标签 linux bash csv awk grep

如果我在 file1.csv 中有以下内容(空格分隔):

RED 4 VWX
BLUE 2 MNO
BLUE 7 DEF
PURPLE 6 JKL
BLACK 8 VWX
BROWN 1 MNO
RED 1 GHI
RED 7 ABC

以及 file2.csv 中的以下内容(逗号分隔):

BROWN,2
RED,5
YELLOW,8

有没有办法使用 file2.csv 在 file1.csv 中搜索匹配行?目前,如果我想使用 file2.csv 中的第 1 行术语来搜索 file1.csv,我必须手动输入以下内容:

grep "BROWN" file1.csv | grep "2"

我想自动执行此搜索以在 file1.csv 中查找与 file2.csv 中给定行中的两个项目匹配的行。我已经尝试了一些 awk 命令,但是我很难在 grep 中使用 awk 输出作为参数。我通过标准的 Mac 终端运行所有这些(所以我想我正在使用 bash?)非常感谢任何帮助。谢谢!

最佳答案

awk 一行

awk 'FNR==NR{a[$1]=$2; next} ($1 in a) && a[$1]==$2' FS=, file2.csv FS=" " file1.csv

FNR==NR{a[$1]=$2; next} :要读取第一个输入文件,这里是 file2.csv 并创建一个关联数组 a,其中键作为 file2.csv< 中的第 1 列 和值作为 项目编号

($1 in a) && a[$1]==$2:在迭代第二个输入文件时,即 file1.csv,检查第 1 列值是否作为键存在在数组 a 中。如果存在,检查 item number 是否匹配。如果匹配,结果将为 1 并打印行。

或者

只需使用 grep

grep -wf <(tr "," " " <file2) file1

在这里,我们使用 tr 将 file2 中的 , 替换为空格 并使用 file2 中的每一行作为在 file1 中搜索的模式 使用我们可爱的 grep

提供的 -f 选项

-w 是匹配字边界,这样ABC 1 就不会匹配ABC 123

关于linux - Grep csv 与来自另一个 csv 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46960837/

相关文章:

linux - 覆盖 bash 脚本中的 LANG 变量

bash - 使用传递的文件名打开 vi

Javascript - 如何将原始对象传递给回调函数

java - CSV 保留 CRLF 同时替换 LF

php - 如何在CSV文件中保留反斜杠或将其更改为NULL以在PHP中生成SQL文件

linux - 在 shell 脚本中提取版本字符串

linux - 给定用户计算他们的进程消耗了多少字节

PHP Imagemagick PDF 转 GIF

arrays - 检索 jq 结果作为一个列表对象,而不是一串成员

bash - 如何从特定于可执行文件的终端启用制表符完成