Bash
在AWK中將變數插入字元串
我正在嘗試使用循環和 awk 命令將變數傳遞給簡單的 bash 腳本。
#!/bin/bash #! script to filter data to respective directories. for i in {1..9}; do awk -F "\t" -v num="$i" '$3 ~ /^ *2017-0$num/ {print}' source1.txt source2.txt > energydata/2017/$i/results.txt done;
我能夠像這樣成功執行 awk 命令:
awk -F "\t" '$3 ~ /^ *2017-01/ {print}' source1.txt source2.txt > energydata/2017/1/results.txt
我只是希望能夠遍曆日期中的月份列並幫助自動化此過程。我認為我錯誤地使用了 -v 變數傳遞,但似乎無法弄清楚如何將變數附加到這樣的日期。我知道如果我在設定的日期內聯執行 awk 語句,它就可以工作,它只是試圖插入讓我混亂的變數。
任何提示或建議都有幫助
樣本輸入和輸出:
原始碼1.txt:
1 dog 2020-02-03 2 cat 2017-01-12
原始碼2.txt:
5 Frog 2022-02-05 7 Mouse 2017-01-11
輸出:energydata/2017/01/results.txt
2 cat 2017-01-12 7 Mouse 2017-01-11
如果我沒記錯的話,該
/.../
語法僅適用於 AWK 中的常量正則表達式。如果你想匹配一個變化的正則表達式,你必須將它作為一個字元串傳遞。此外,$
它只是一個選擇編號欄位的運算符,它不會擴展變數。相反,您只需背靠背編寫字元串和/或變數來連接它們。所以,例如,這行得通
% echo 2017-01 | awk -v m=1 '$1 ~ "2017-0" m { print "match" }' match
或者,你可以這樣做
{ pattern = "2017-0" m; if ($1 ~ pattern) ... }
,但它不會那麼簡潔。無論如何,如果您想根據內容將輸入行拆分為文件,您還可以讓 AWK 建構文件名並打開輸出文件本身。
例如,這將建構文件名,如, where和從該行的第三個欄位中選取。不過,您必須事先創建目錄。
energydata/*yyyy*/*mm*/results.txt``yyyy``mm
awk -F "\t" '{ split($3, date, "-"); filename = "energydata/" date[1] "/" date[2] "/results.txt"; print > filename }' source.txt