输出重定向通常是您正在使用的 shell 的一项功能,考虑到它的使用量,如果您在其中发现错误,我会非常惊讶 :-)
您确定不尝试使用 awk 本身而不是 shell 进行重定向吗?
当你这样做时会发生什么:
echo 'hello' | awk '{print}' >qq.tmp
更新:
如果这是您所述的代码,那是因为 $a 没有被您的 shell 脚本扩展,因为 awk 命令在单引号内。
for a in $(find $OUPUT_DIR/ -maxdepth 1 -mindepth 1 -type d -printf "%P\n")
do
echo $a is a directory
awk -F, '{ if ($10 == '"$a"') print $0 }' $OUPUT_DIR/CDRNOutput_${CDR_DATE}.csv > $OUPUT_DIR/$a/CDR-${CDR_DATE}.csv
done
我倾向于使用-v 选项将特定值传递给awk,类似于(在您的情况下):
awk -F, -v a=$a '{ if ($10==a) print $0 }' ...
然后变量成为一流的awk 公民,而不必担心谁在进行扩展。
进一步更新:
我支持我最初的建议。选择的方法肯定有问题。
我的主目录中有一个名为 XpVm(以及其他)的目录,并且我创建了包含单行的文件 CDRNOutput_X.csv:
1,2,3,4,5,6,7,8,9,XpVm,11
当我执行时:
for a in $(find . -maxdepth 1 -mindepth 1 -type d -printf "%P\n" | grep -v '^\.')
do
echo $a is a directory
awk -F, '{
if ($10 == '"$a"') {
print $0
} else {
print "NO";
}
}' ./CDRNOutput_X.csv
done
(我已经删除了以. 开头的目录,因为它们引起了另一个问题),我得到了这个输出:
workspace is a directory
NO
Documents is a directory
NO
XpVm is a directory
NO
Downloads is a directory
NO
这显然不是预期的。但是,当我按照我最初的建议将-v 选项用于awk 时,命令:
for a in $(find . -maxdepth 1 -mindepth 1 -type d -printf "%P\n" | grep -v '^\.')
do
echo $a is a directory
awk -F, -v a=$a '{
if ($10 == a) {
print $0
} else {
print "NO"
}
}' ./CDRNOutput_X.csv
done
(唯一的区别是对a 的更改),我得到:
workspace is a directory
NO
Documents is a directory
NO
XpVm is a directory
1,2,3,4,5,6,7,8,9,XpVm,11
Downloads is a directory
NO
这是正确的。
最终更新(希望如此):
我想我的问题已经解决了。我现在在另一台机器上(所以目录名称只是tmp 和tmp2),当我运行原始脚本时:
for a in $(find . -maxdepth 1 -mindepth 1 -type d -printf "%P\n" | grep -v '^\.')
do
echo $a is a directory
awk -F, '{
if ($10 == '"$a"') {
print $0
} else {
print "NO";
}
}' ./CDRNOutput_X.csv
done
修改后的CDRNOutput_X.csv 包含tmp 而不是XpVm,我得到:
tmp is a directory
NO
tmp2 is a directory
NO
这是因为if 语句被awk 视为:
if ($10 == tmp) {
(不带引号,因为引号实际上是 在awk 字符串用于包围目录名称)。这将测试$10 与awk 变量tmp 的相等性,而不是实际的字符串"tmp"。您需要确保引号在 inside awk 脚本中,例如:
if ($10 == "tmp") {
您可以使用以下脚本执行此操作(仅 if 行已更改):
#!/bin/bash
for a in $(find . -maxdepth 1 -mindepth 1 -type d -printf "%P\n" | grep -v '^\.')
do
echo $a is a directory
awk -F, '{
if ($10 == "'"$a"'") {
print $0
} else {
print "NO";
}
}' ./CDRNOutput_X.csv
done
请注意,双引号是重复的。我仍然在$a 周围立即保留双引号,以防有人犯下了创建带有空格的文件的令人发指的罪行:-)
运行该脚本会产生:
tmp is a directory
1,2,3,4,5,6,7,8,9,tmp,11
tmp2 is a directory
NO
这就是我认为你的目标。
所以,结果是,如果您不想使用 awk 变量,您可以将您的 awk 字符串更改为:
'{ if ($10 == '"$a"') print $0 }'
到:
'{ if ($10 == "'"$a"'") print $0 }'
它应该可以正常工作。