[英]How to pass column name of a file as variable in awk
我試圖通過將它們傳遞給int awk命令來打印特定列中的數據
我曾嘗試使用"-v"
將其設置為變量,但其將"$"
視為字符串。 我的定界符是特殊字符^A
(ctrl + v + a)。
vi test_file.dat
a^Ab^Ac^Ad^Ae^Af^Ag^Ah^Ai^Aj^Ak^Al^Am^An^Ao^Ap
工作代碼
awk -F'^A' '{print $2,$5,$7}' test_file.dat
印刷中
b e g
但是如果我嘗試
export fields='$2,$5,$7'
export file='test_file.dat'
awk -v sample_file="$test_file.dat" -v columns="$fileds" -F'^A' '{print columns}' sample_file
正在打印
$2 $5 $7
我期望輸出為
b e g
我想將定界符,列,文件名作為參數傳遞
export fields='$2,$5,$7'
export file='test_file.dat'
export delimiter='^A'
awk -v sample_file="$test_file.dat" -v columns="$fields" -v file_delimiter="$delimiter" -F'file_delimiter' '{print columns}' sample_file
為了使awk
在讀取文件時能看到特殊字符,可以使用cat -v file
(可能有一個內置方法,盡管我不知道)。 然后,使字符^A
( Control-A )分隔符被識別的關鍵是用\\
對其進行轉義,否則awk
, gawk
等的正則表達式功能是將^
視為行的開始。
export fields='$2,$5,$7'
export test_file='test_file.dat'
export delimiter='\\^A'
awk -F $delimiter '{ print '$fields' }' < <(cat -v test_file)
也不需要為已經設置的bash
變量設置awk
變量-因此您可以從根本上消除所有變量。
如果您確實要在awk
設置它們,要注意的一件事是columns
將不起作用,因為通常從bash
變量中設置awk
變量將被單獨分配。 例如, -v var1='$2' -v var2='$5' -v var3='$7'
,因此最終會在awk
使用{ print var1, var2, var3 }
。 令人懷疑的是,單個字符串可以將其轉換為三個變量而無需其他步驟。
在awk中, $
符號實際上是一個運算符,它以字段編號作為參數。 字段名稱是表達式,這就是$NF
表示最后一個字段的原因: NF
由$
運算符求值 。 如您所見,我們不應該在字段名稱中包含美元符號。
如果您正在使用環境將材料傳遞給Awk,則正確的做法是讓Awk從環境中拾取材料。
可以使用ENVIRON
關聯數組訪問該環境。 如果一個名為delimiter
的變量包含字段分隔符,我們可能會做類似的事情
BEGIN { FS = ENVIRON["delimiter"] }
在Awk代碼中。 然后,我們不再處理另一輪外殼參數插值問題。
我們可以類似地獲取字段編號。 split
函數可用於將它們放入數組。 請參閱以下一線:
$ fields=1,3,9 awk 'BEGIN { split(ENVIRON["fields"], f, ",") ;
for (i in f)
printf("f[%d] = %d\n", i, f[i]) ; }'
f[1] = 1
f[2] = 3
f[3] = 9
表達式length(f)
給出了字段數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.