簡體   English   中英

如何在awk中將文件的列名作為變量傳遞

[英]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 (可能有一個內置方法,盡管我不知道)。 然后,使字符^AControl-A )分隔符被識別的關鍵是用\\對其進行轉義,否則awkgawk等的正則表達式功能是將^視為行的開始。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM