Eri*_*pir 4 linux bash scripting awk
我试图在我的脚本中输出'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
Run Code Online (Sandbox Code Playgroud)
输出重定向通常是你正在使用的shell的一个特性,并且考虑到它有多少使用,如果你发现了一个bug,我会非常惊讶:-)
你确定你不是试图用awk自己而不是shell 进行重定向吗?
当你这样做时会发生什么:
echo 'hello' | awk '{print}' >qq.tmp
Run Code Online (Sandbox Code Playgroud)
更新:
如果这是您所说的代码,那是因为$ashell脚本没有扩展,因为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
Run Code Online (Sandbox Code Playgroud)
我倾向于将特定值传递给awk使用该-v选项,例如(在您的情况下):
awk -F, -v a=$a '{ if ($10==a) print $0 }' ...
Run Code Online (Sandbox Code Playgroud)
然后变量成为一等awk公民,而不必担心谁在进行扩张.
进一步更新:
我站在原来的建议背后.选择的方法肯定会搞砸.
我的主目录中有一个名为XpVm的目录(以及其他目录),我创建了CDRNOutput_X.csv包含单行的文件:
1,2,3,4,5,6,7,8,9,XpVm,11
Run Code Online (Sandbox Code Playgroud)
当我执行:
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
Run Code Online (Sandbox Code Playgroud)
(我已经剥离了目录,.因为它们导致了另一个问题),我得到了这个输出:
workspace is a directory
NO
Documents is a directory
NO
XpVm is a directory
NO
Downloads is a directory
NO
Run Code Online (Sandbox Code Playgroud)
这显然不是预期的.但是,当我按照我最初的建议使用该-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
Run Code Online (Sandbox Code Playgroud)
(唯一的区别是变化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
Run Code Online (Sandbox Code Playgroud)
哪个是对的.
最后更新(希望如此):
我想我已经解决了问题.我现在在另一台机器上(所以目录名称简单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
Run Code Online (Sandbox Code Playgroud)
用修改后的CDRNOutput_X.csv含tmp而不是XpVm,我得到:
tmp is a directory
NO
tmp2 is a directory
NO
Run Code Online (Sandbox Code Playgroud)
那是因为该if声明被视为awk:
if ($10 == tmp) {
Run Code Online (Sandbox Code Playgroud)
(不带引号,因为引号实际上在awk用于包围目录名称的字符串之外).这将测试$10与被awk调用变量的相等性tmp而不是实际的字符串"tmp".你需要的是确保引号是里面的awk脚本,如:
if ($10 == "tmp") {
Run Code Online (Sandbox Code Playgroud)
并且您可以使用以下脚本执行此操作(仅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
Run Code Online (Sandbox Code Playgroud)
请注意,双引号是重复的.我仍然保持双引号$a,以防万一有人犯下了创造一个带有空格的文件的令人发指的罪行:-)
运行该脚本会产生:
tmp is a directory
1,2,3,4,5,6,7,8,9,tmp,11
tmp2 is a directory
NO
Run Code Online (Sandbox Code Playgroud)
这就是我认为你的目标.
所以,结果是,如果你不想使用awk变量,你可以改变你的awk字符串:
'{ if ($10 == '"$a"') print $0 }'
Run Code Online (Sandbox Code Playgroud)
至:
'{ if ($10 == "'"$a"'") print $0 }'
Run Code Online (Sandbox Code Playgroud)
它应该运作正常.
| 归档时间: |
|
| 查看次数: |
30907 次 |
| 最近记录: |