【问题标题】:Grep-ing a list of filename against a csv list of names将文件名列表与 csv 名称列表相比较
【发布时间】:2014-06-18 09:49:17
【问题描述】:

我有一个 CSV 文件,其中包含一个 id 和数字列表,每一个都在一行中。我们称该文件为 ids.csv 在一个目录中,我有大量文件,名称为“file_123456_smth.csv”,其中 123456 是可以在 ids csv 文件中找到的 id 现在,我要实现的目标是:将文件名与存储在 ids.csv 中的 id 进行比较。如果在 ids.csv 中找到 123456,则应显示文件名。 我试过的:

ls -a | xargs grep -L cat ../../ids.csv

当然,这行不通,但可以让我知道我的方向。

【问题讨论】:

  • 我不知道为什么要标记Python,但是如果您不想要二次解,可以使用set或dict。
  • @user189 Python 是由 SO 自动建议的,并没有注意到它。

标签: shell unix csv awk


【解决方案1】:

让我们看看我是否理解正确......

$ cat ids.csv 
123
456
789

$ ls *.csv
file_123_smth.csv  file_321_smth.csv  file_789_smth.csv  ids.csv

$ ./c.sh 
123 found in file_123_smth.csv
789 found in file_789_smth.csv

其中 c.sh 如下所示:

#!/bin/bash

ID="ids.csv"

for file in *.csv
do
    if [[ $file =~ file ]]    # just do the filtering on files
    then                      # containing the actual string "file"
        id=$(cut -d_ -f2 <<< "$file")
        grep -q "$id" $ID && echo "$id found in $file"
    fi
done

【讨论】:

  • 该示例效果很好,但是当我尝试将其更新为现实生活中的文件名时,它却没有 - 真正的文件名是这样的:Offerfeed_9901223_en.full.csv。我应该如何添加切割以匹配这个?谢谢!
  • 另外,你能解释一下 if [[ $file =~ file ]] 应该做什么吗?
  • 很高兴你喜欢它!运算符 =~ 是 bash 正则表达式匹配。我用它来查看文件名中是否存在字符串“file”。这样做的原因是只对正确的文件名而不是 ids.csv 进行解析,因为我使用 globbing *.csv 列出所有要解析的文件。
  • 关于您的第一条评论。将file 更改为Offerfeed。在我之前的评论中查看我对原因的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多