用于过滤包含来自另一个文件的匹配列的zip文件中的记录的shell脚本

时间:2015-12-16 03:19:36

标签: regex shell unix awk sed

不确定这是否是此问题的正确论坛。我有两个文件。 file1.zip,file2

输入:

file1.zip
col1    col2    col3
a       b   0:0:0:0:0:c436:9346:d40b
x       y   0:0:0:0:0:880:39f9:c9a7
m       n   0:0:0:0:0:80c7:9161:fe00

file2.txt
col1
c4:36:93:46:d4:0b
08:80:39:f9:c9:a7
48:1d:60:62:f5:9d

我需要

  • 将file1中的col3转换为file2格式的col1,即ab:cd:ef:gh:ij:kl 通过填充0表示并使用分号':'表示每2个字符
    修剪前10个字符。
  • 将其与表B中的col1进行比较并存储匹配的列

上述方案的必需输出

col1    col2    col3
a       b   c4:36:93:46:d4:0b
x       y   08:80:39:f9:c9:a7

我有1500个zip文件和一个参考文件。不知道如何在unix中实现这一点。有人可以帮忙。

对于直接文件,我使用

ls *.zip | awk '{ print "zipgrep -f file2.txt "$0" >> result.csv"}' | xargs -I {}

3 个答案:

答案 0 :(得分:1)

您可以将已清理的地址存储在变量grep -q中,以查看它是否存在于使用进程替换的file2的第一列中。

<强>更新

header="" && IFS=$(echo -en "\n\b") && for a in $(zcat -Szip file1.txt.zip); do 
[[ -z "$header" ]] && header="$a" && echo "$header" >> results.txt && continue 
addr=$(awk '{print $3}' <<< "$a" | sed 's/0:0:0:0:0://;s/\([^:][^:]\)\([^:][^:]\)/\1:\2/g;s/\([^:]\)\([^:][^:]\)/0\1:\2/g')
read -d'\n' col1 col2 < <(awk '{printf $1"\n"$2}' <<< "$a") 
for b in file[^1].txt.zip; do 
 zgrep -q "$addr" <(awk '{print $1}' <(zcat -Szip "$b")) && echo "${col1} ${col2} ${addr}" >> results.txt; 
done  
done

代码回显第一行作为标题,随后的匹配将在第一个文件中回显第一列和第二列,第一个文件中第三列的已清理和匹配的地址。

答案 1 :(得分:1)

#!/bin/bash
FILE1=file1.txt
FILE2=file2.txt

awk -v dict="$FILE2" '
  function pad(x, padding) {
    if (length(x) >= 1+length(padding)) {return x};
    return substr(padding x, length(x));
  }
  BEGIN { while ( getline < dict ) { keep[$1]=$1 }}
  NR==1 {print; next}  # print the header
  {s = substr($3,11); n=split(s,a,":"); 
   ans="";
   for (i=1; i<=n; i++) { 
     a[i] = pad(a[i], "000"); 
     ans = ans (ans==""?"":":") substr(a[i],1,2) ":" substr(a[i],3);
   }
   if (keep[ans]) { $3=ans; print }
  }' "$FILE1"

由于您表示您只有一个参考文件,我会将其解压缩到(可能是)临时文件;每个其他文件都可以“动态”解压缩。因此,除了'awk ...'$ FILE1“'之外,你可以把它放在一个循环中,沿着

ls *.zip | while read FILE1 ; do unzip -p "$FILE1" | awk ... ; done

答案 2 :(得分:0)

awk救援!

$ awk -v OFS="\t" 
    'NR==FNR{t=$0;gsub(":","");a[$0]=t;next} 
      FNR==1; 
       FNR>1{v=""; 
             n=split($3,b,":"); 
             for(i=n-2;i<=n;i++) 
                v=v sprintf("%04s",b[i]); 
            } 
      v in a{print $1,$2,a[v]}' file2 file1

col1    col2    col3
a       b       c4:36:93:46:d4:0b
x       y       08:80:39:f9:c9:a7