用于检查字符串是否在文件中的Ruby脚本?

时间:2012-01-26 07:26:53

标签: ruby bash csv awk

我有 CSV文件的单词及其频率以及 .txt文件,其中包含多个感兴趣的单词,以换行符分隔。

我正在寻找一种方法来检查对于CSV的每一行,第一列值(单词)是否也在.txt文件中。

我想类似于fgrep -x -f patternfile.txt data.csv的东西,除了只有1列CSV而不是整行?

5 个答案:

答案 0 :(得分:4)

嘿你可以使用FasterCSV打开并循环播放记录。

        FasterCSV.foreach("#{file_path}") do |row| 
        puts row[0]#row[0] is the first column only
        end 

答案 1 :(得分:2)

如果我们使用bash,那将是:

fgrep -x -f patternfile.txt data.csv | awk '{print $2}'

作为从grep结果中获取第二列的简单方法

答案 2 :(得分:1)

要检查文件中是否至少有一个特定字符串:

IO.readlines(filename).map(&:chomp).include?("somestring")

答案 3 :(得分:1)

使用awk你可以做这样的事情 -

awk -v FS="," 'NR==FNR{a[$1]=$0;next} ($1 in a){print a[$1]}' csv_file txt_file
  • 将字段分隔符设置为,
  • 使用csv文件的第一列(word)作为索引,将整行添加到数组中。
  • 检查文本文件的值是否在数组中。
  • 如果是,则将其打印

测试:

[jaypal:~/Temp] cat csv_file 
jack,4
rabbit,10
cat,4
red,39

[jaypal:~/Temp] cat txt_file 
red
rabbit
cat

[jaypal:~/Temp] awk -v FS="," 'NR==FNR{a[$1]=$0;next} ($1 in a){print a[$1]}' csv_file txt_file
red,39
rabbit,10
cat,4

答案 4 :(得分:0)

要合并Phrogz'syatish's个答案:

require 'csv'
words = File.readlines("words.txt").map(&:chomp)
CSV::foreach("data.csv") {|row| puts row.to_csv if words.include?(row[0])}