这个脚本:
while read ACCT ; do
echo $ACCT
zgrep -h ^$ACCT datafile.0[2-3]2015.gz >>/tmp/$ACCT.txt
done < /account_list.txt
我没有得到重定向的输出文件当我删除时'>>/tmp/$ACCT.txt'
,输出将转到标准输出,这是预期的。我不明白为什么在这个例子中我没有得到重定向的输出。我也尝试过,而不是 zgrep...
zcat datafile.0[2-3]2015.gz|grep ^$ACCT>>/tmp/$ACCT.txt...
但这不会产生任何输出。
答案1
如果不知道一段代码中包含哪些数据,就很难调试它。因此,除了说可能应该用双引号引起来之外,我不会猜测您的代码可能有什么问题^$ACCT
,就像所有其他出现的$ACCT
.
不要zgrep
为 in 的每一行调用一次account_list.txt
(解压缩这些数据文件的次数与该文件中的行数相同),而是将帐户读入数组 inawk
并在一次传递中进行处理:
awk 'NR==FNR { acct[$1]; next }
$1 in acct { file="/tmp/" $1 ".txt"; print >>file; close(file) }' \
account_list.txt <( zcat datafile.0[2-3]2015.gz )
这假设bash
或其他一些理解进程替换的 shell。它还假设帐户列表在第一列中包含帐户名称,并且数据文件也在第一列中包含帐户名称(您实际上没有显示这些文件的样子,所以我不能说是否这是否有效)。
第一个awk
块仅针对第一个文件 执行,account_list.txt
并将创建一个关联数组 ,acct
并将要提取的帐户名称作为键。
第二个块仅在提取的数据文件的行上执行,如果第一个字段对应于 中的键acct
,则该行将打印到适当命名的文件中。