用于从参考文件中搜索目录的Unix脚本

时间:2017-11-09 10:24:53

标签: unix grep redhat

我有一个引用csv文件,它有Column1,Column2。我需要目录中的文件名列表,其中 column1和column2中的值在同一记录(行)中。递归检查csv文件中的所有参考数据,输出应该是......" column1,column2,filename" ...

这些文件也可以是.dat文件和.gz压缩文件。请帮我一个unix脚本。版本Red Hat 6.9。

**Csv Reference File:**  
Column1,Column2  
Record1Col1,Record1Col2  
Record2Col1,Record2Col2  
Record3Col1,Record3Col2  
Record4Col1,Record4Col2  
Record5Col1,Record5Col2  

**Output:**  
Record1Col1,Record1Col2,txt1.dat  
Record1Col1,Record1Col2,txt2.dat  
Record1Col1,Record1Col2,txtzip1.gz  
Record2Col1,Record2Col2,txt2.dat  
Record2Col1,Record2Col2,txtzip5.gz  
Record4Col1,Record4Col2,txtzip7.gz  

sample data file...  
**txt1.dat:**  
Xyz|somevalue|Record1Col1|somevalue|somevalue|123|Record1Col2|xyz|  
Abc|somevalue|somevalue|somevalue|xyz|  
Record2Col1|somevalue|Somevalue|123|somevalue|  

1 个答案:

答案 0 :(得分:0)

您可以使用awk执行此操作,

$ cat awk-script 
NR==FNR{                      # in reference.csv
  a[FNR]=$1;b[FNR]=$2;        # record the first field into a[FNR], and second into b[FNR]
  next
}
{
  for(i=1;i<=length(a);i++){         # for other files,
    if(($0 ~ a[i]) && ($0 ~ b[i]))   # search if each line contained a[i] && b[i]
      print a[i],b[i],FILENAME       # print it if yes
  }
}

$ awk -F'[, ]' -v OFS="," -f awk-script reference.csv *[^csv]
Record1Col1,Record1Col2,txt1.dat
Record1Col1,Record1Col2,txt2.dat

解释

  • 将字段分隔符设置为[, ],因为有些记录会在帖子中附加空格。并为请求输出设置输出分隔符OFS=","
  • 请注意,我强制awk的已处理文件顺序为reference.csv *[^csv]。所以awk首先解析reference.csv然后解析其他非csv文件。订单无法更改,因为我们需要先在reference.csv中记录该值,然后我们可以将它们查看到其他文件中。
  • 对于awk-script,您可能会看到附加的评论以获取更详细的信息。

如果这有助于您,请告诉我。