不确定这是否是此问题的正确论坛。我有两个文件。 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
我需要
上述方案的必需输出
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 {}
答案 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