【问题标题】:grep a csv file using as input another csv or txt filegrep 使用另一个 csv 或 txt 文件作为输入的 csv 文件
【发布时间】:2012-12-26 06:16:43
【问题描述】:

我有两个 csv 文件:

第一个,我们称之为 file1.csv,包含我需要的信息,类似于:

Cell,Bitrate,Loss Ratio,Retransmitted Ratio
MI456,400,0.6,2.3,....
MI457,400,0.6,2.3,...
MI458,400,0.6,2.3,...   
.
.
.

第二个,file2.csv,有我需要从 file1 中提取的单元格子集,它是这样的:

Cell
MI400
CA500
VE600   

我希望我的输出是:

Cell,Bitrate,Loss Ratio,Retransmitted Ratio
MI400,400,0.6,2.3,....
CA500,400,0.6,2.3,...
VE600,400,0.6,2.3,...   

我正在尝试使用:

cat file1.csv | grep -f file2.csv

或 grep -f

但是没有成功,你能帮帮我吗?

我使用的是 Linux 2.6.31.2 x86_64 GNU/Linux

【问题讨论】:

  • file2.csv 中有多少个元素?
  • 该输入会产生准确的输出吗?还是您只是将该 I/O 用作文件的示例?
  • 在 file1.csv 中有大约 100k 行,在 file2.csv 中有 5k 行。
  • 生成的输出应该是非常相似的,不同的是file1.csv大约有450列。

标签: bash shell csv awk grep


【解决方案1】:

这会将 file1.csv 中的第一列替换为 file2.csv 的内容:

cut -d',' -f2- file1.csv | paste -d',' file2.csv -

【讨论】:

  • 我认为他正在尝试使用 file2 作为对 file1 的查询,而不是作为替代(请参阅下面的答案)。
  • 这正是我刚要发布的答案,这时你的答案出现了。但经过重新考虑,我认为我们有点没有注意到问题中的关键字“提取”和“子集”。用户似乎实际上想要输出以 file2 开头的每一行 file1 作为其第一个字段。
  • 是的,我希望我的输出文件与您刚才所说的一样。现在我将尝试测试发布的解决方案。非常感谢每一个人!
【解决方案2】:
for FOO in `cat file2.csv`; do
    grep "^$FOO" file1.csv
done

如果 file2.csv 有很多行,这会很慢。

【讨论】:

  • 我是业余爱好者,所以也许这是一个非常愚蠢的问题。我必须直接在bash中编写脚本吗?
  • @user1970421,用 bash 写就行了。
  • 您需要在 grep 上的 FOO 后加一个逗号,否则它将匹配 MI45 与 MI45 和 MI456 等。
【解决方案3】:

也许您以错误的方式使用了-f 选项

这是一个例子:

文件1:

Cell,Bitrate,Loss Ratio,Retransmitted Ratio
MI456,400,0.6,2.3,....
MI457,400,0.6,2.3,...
MI458,400,0.6,2.3,...
MI465,400,0.6,2.3,...
MI477,400,0.6,2.3,...

文件2:

MI456
MI457
MI465

grep:

grep -f file2 file1
MI456,400,0.6,2.3,....
MI457,400,0.6,2.3,...
MI465,400,0.6,2.3,...

【讨论】:

  • 这会在各种情况下导致不正确的输出,例如,如果 MI4567 出现在 file1 中,或者 MI456 可能出现在一行中的其他位置,而不是仅出现在第一个字段中。
  • 谢谢洛伦佐。我尝试使用它但没有成功,尽管正如 Ed 所说,这是不正确的,因为有单元格命名为例如:MI45。
【解决方案4】:
{
  sed 1q file1.csv
  join -t, <(sed 1d file1.csv | sort) <(sed 1d file2.csv | sort)
} > newfile.csv

join 要求对输入文件进行排序。我正在使用sed 删除进程替换中的标题行。

【讨论】:

    【解决方案5】:
    awk -F, 'NR==FNR{a[$0];next} $1 in a' file2.csv file1.csv
    

    【讨论】:

    • 它什么也没给我。我会发布文件,但 file1 是 200MB。
    • 我认为导致问题的原因是 file1.csv 中没有空格。字段用“,”分隔。
    • 不,这不是问题,脚本使用-F, 处理。 file1.csv 中的行尾是否有空格?是否在 DOS 中创建了任何一个文件,所以有虚假的 control-Ms?在每个文件上尝试head file | cat -v 以查看控制字符是否潜伏。
    • 解决了!问题出在 file2.csv 中。我创建了一个新的,现在一切正常!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多