[英]Print columns using string variable in AWK
我試圖在我的 AWK(或 GAWK)程序中使用一個變量來打印多列。
我正在從命令行打印列:
gawk -v cols=1,2,3 -f sample.awk -F,
我希望能夠在我的BEGIN{}
塊中設置這個變量,並在我的程序的主要部分使用它。
BEGIN{
split(cols, col_arr, FS)
i=1;
col_str = "$"col_arr[1];
for(col in col_arr){
if (i > 1){
col_str = col_str",$"col;
}
i++;
}
}
{
print col_str
}
但是,這只會打印“$1,$2,$3”。 我如何更改它以打印第 1、2 和 3 列?
A BEGIN rule is executed once only, before the first input record is read.
嘗試這樣的事情
awk '{cols = $1 OFS $2 OFS $5; print cols}' file
更新
要么你必須像 Jonathan Leffler 展示的那樣生成腳本,因為不像 shell(和 PERL)AWK 不評估字符串中的變量,或者類似這樣的東西
BEGIN{
sub(/,$/,"",cols)
n=split(cols,C,/,/)
}
function _get_cols(i,s){
for(i=1;i<=n;i++) s = length(s) ? s OFS $(C[i]) : $(C[i])
return s
}
{
print _get_cols()
}
執行
awk -v cols=2,3, -f test.awk infile
或者你必須嘗試其他類似的東西
#!/bin/bash
# Usage : _parse <FS> <OFS> 1 2 3 ... n < file
_parse()
{
local fs="$1"
local ofs="$2"
shift 2
local _s=
local f
for f; do
_s="${_s}\$${f},"
done
awk -F"$fs" -v OFS="$ofs" "{ print ${_s%,} }"
}
# Call function
_parse ' ' '\t' 1 3 < infile
您可能最好使用一個程序(可能awk
)來編寫您最終運行的awk
腳本。
例如:
trap "rm -f script.awk; exit 1" 0 1 2 3 13 15
awk '{ printf "{ print ";
pad = ""; for (i = 1; i <= NF; i++) { printf "%s$%d", pad, $i; pad = ", " }
print " }"
}' <<< "1 2 5" > script.awk
awk -f script.awk data.file
rm -f script.awk
trap 0
要打印的列顯示為 here 字符串,即 Bash 特征,但可以來自文件,或根據需要來自其他來源。 trap
命令是 shell 腳本,可確保刪除臨時文件script.awk
。 如果腳本同時運行,最好將進程 ID 嵌入名稱中以確保唯一性。 如果您真的擔心它,請使用mktemp
或類似程序來創建一個更難猜的名稱。 不要求腳本文件以.awk
; 如果您發現它在附近,它只會清楚地表明它包含什么。
這是沒有循環或 arrays 的方法:
jot -s '' -c - 65 126 |
mawk -f <( mawk -v __='3,59,8,42,17,39' ' BEGIN { OFS =(FS = ",")"$" $(ORS = _) = __ print "{ print $" ($!(NF=NF) ) " } " }' ) FS= OFS='\f'
C
{
H
j
Q
g
在子進程awk
調用中發生的事情是在動態生成此代碼所需的列中進行硬編碼:
# gawk profile, created Mon Jan 16 18:27:35 2023
# Rule(s)
1 {
1 print $3, $59, $8, $42, $17, $39
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.