簡體   English   中英

在 AWK 中使用字符串變量打印列

[英]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.

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