
使用’>’不起作用,为什么?
for a in $(find $OUPUT_DIR/ -maxdepth 1 -mindepth 1 -type d -printf "%P\n")do echo $a is a directory awk -F,'{ if ( == '"$a"') print echo 'hello' | awk '{print}' >qq.tmp }' $OUPUT_DIR/CDRNOutput_${CDR_DATE}.csv > $OUPUT_DIR/$a/CDR-${CDR_DATE}.csvdone解决方法 输出重定向通常是你正在使用的shell的一个特性,并且考虑到它有多少使用,如果你发现了一个BUG,我会非常惊讶:-) 你确定你没有尝试用awk本身而不是shell进行重定向吗?
当你这样做时会发生什么:
for a in $(find $OUPUT_DIR/ -maxdepth 1 -mindepth 1 -type d -printf "%P\n")do echo $a is a directory awk -F,'{ if ( == '"$a"') print awk -F,-v a=$a '{ if (==a) print 1,2,3,4,5,6,7,8,9,XpVm,11
}' ... }' $OUPUT_DIR/CDRNOutput_${CDR_DATE}.csv > $OUPUT_DIR/$a/CDR-${CDR_DATE}.csvdone 更新:
如果这是你所说的代码,那是因为你的shell脚本没有扩展$a,因为awk命令在单引号内.
for a in $(find . -maxdepth 1 -mindepth 1 -type d -printf "%P\n" | grep -v '^\.')do echo $a is a directory awk -F,'{ if ( == '"$a"') { print workspace is a directoryNOdocuments is a directoryNOXpVm is a directoryNODownloads is a directoryNO
} else { print "NO"; } }' ./CDRNOutput_X.csvdone 我倾向于使用-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 ( == a) { print workspace is a directoryNOdocuments is a directoryNOXpVm is a directory1,11Downloads is a directoryNO
} else { print "NO" } }' ./CDRNOutput_X.csvdone 然后变量成为一流的awk公民,而不必担心谁在进行扩展.
进一步更新:
我站在原来的建议背后.选择的方法肯定会搞砸.
我的主目录中有一个名为XpVm的目录(以及其他目录),我创建了包含单行的CDRNOutput_X.csv文件:
for a in $(find . -maxdepth 1 -mindepth 1 -type d -printf "%P\n" | grep -v '^\.')do echo $a is a directory awk -F,'{ if ( == '"$a"') { print tmp is a directoryNOtmp2 is a directoryNO
} else { print "NO"; } }' ./CDRNOutput_X.csvdone 当我执行:
if ( == tmp) { (我已经删除了以.开头的目录,因为它们导致了另一个问题),我得到了这个输出:
if ( == "tmp") { 这显然不是预期的.但是,当我按照我最初的建议使用-v选项时,命令:
#!/bin/bashfor a in $(find . -maxdepth 1 -mindepth 1 -type d -printf "%P\n" | grep -v '^\.')do echo $a is a directory awk -F,'{ if ( == "'"$a"'") { print tmp is a directory1,tmp,11tmp2 is a directoryNO
} else { print "NO"; } }' ./CDRNOutput_X.csvdone (唯一的区别是a的变化),我得到:
'{ if ( == '"$a"') print '{ if ( == "'"$a"'") print }' }' 哪个是对的.
最后更新(希望如此):
我想我已经解决了问题.我现在在另一台机器上(所以目录名称只是tmp和tmp2),当我运行原始脚本时:
使用包含tmp而不是XpVm的修改后的CDRNOutput_X.csv,我得到:
那是因为awk将if语句看作:
(没有引号,因为引号实际上在用于包围目录名称的awk字符串之外).对于名为tmp的awk变量而不是实际的字符串“tmp”,这将测试10美元.你需要的是确保引号在awk脚本中,如:
并且您可以使用以下脚本执行此 *** 作(仅if行已更改):
请注意,双引号是重复的.我仍然在$a附近保留双引号以防万一有人犯下了创造一个带有空格的文件的令人发指的罪行:-)
运行该脚本会产生:
这就是我认为你的目标.
所以,结果是,如果你不想使用awk变量,你可以改变你的awk字符串:
至:
它应该运作正常.
总结以上是内存溢出为你收集整理的linux – 如何将awk结果输出到文件全部内容,希望文章能够帮你解决linux – 如何将awk结果输出到文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)