linux导出并追加到文件,linux – 如何将awk结果输出到文件
輸出重定向通常是你正在使用的shell的一個特性,并且考慮到它有多少使用,如果你發現了一個bug,我會非常驚訝:-)
你確定你沒有嘗試用awk本身而不是shell進行重定向嗎?
當你這樣做時會發生什么:
echo 'hello' | awk '{print}' >qq.tmp
更新:
如果這是你所說的代碼,那是因為你的shell腳本沒有擴展$a,因為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選項時,命令:
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
使用包含tmp而不是XpVm的修改后的CDRNOutput_X.csv,我得到:
tmp is a directory
NO
tmp2 is a directory
NO
那是因為awk將if語句看作:
if ($10 == tmp) {
(沒有引號,因為引號實際上在用于包圍目錄名稱的awk字符串之外).對于名為tmp的awk變量而不是實際的字符串“tmp”,這將測試10美元.你需要的是確保引號在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 }'
它應該運作正常.
總結
以上是生活随笔為你收集整理的linux导出并追加到文件,linux – 如何将awk结果输出到文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核 漏洞扫描,Linux k
- 下一篇: linux运行欧陆风云,MY-SAMA5