Bash

在AWK中將變數插入字元串

  • November 6, 2022

我正在嘗試使用循環和 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

引用自:https://unix.stackexchange.com/questions/723867