簡體   English   中英

AWK - 包含必填字段的字符串

[英]AWK - string containing required fields

我認為定義一個字符串(如“1 2 3”)並在 AWK(GAWK)中使用它來提取所需字段會很容易,我錯了。

我試過創建 AWK arrays、BASH arrays、拆分、字符串替換等,但找不到任何方法在打印語句中使用生成的“塊”(即列/字段編號)。

我相信 Akshay Hegde 通過get_cols function 在這里提供了一個很好的解決方案

但那是 8 年多以前的事了,我真的在努力弄清楚“它是如何工作的”,即它在做什么; s = length(s)? s OFS $(C[i]): $(C[i])

由於我缺乏聲譽(這是一個舊帖子),我無法發表評論要求澄清。 有人能夠解釋該解決方案的工作原理嗎?

注意我不認為我需要 sub 因為我使用以下清理(用逗號替換所有非數字字符,即分隔符,並按數字排序) Columns=$(echo $Input_string | sed 's/[^0-9]\+/,/g') Columns=$(echo $Columns | xargs -n1 | sort -n | xargs)

(使用此字符串,將使用給定解決方案中的awk -v cols=$Columns -f test.awk infile執行 awk)


鑒於@Ed Morton 提供的信息豐富的答案,以及一個很好的示例,我試圖消除對 function(以及額外的 awk 程序文件)的需求。 目的是將其包含在 shell 腳本中,我寧願它是獨立的,但也希望進一步調查“它是如何工作的”。

Fields="1 2 3"
echo $Fields | awk -F "," '{n=split($0,Column," "); for(i=1;i<=n;i++) s = length(s) ? s OFS $(Column[i]) : $(Column[i])}END{print "s="s " arr1="Column[1]" arr2="Column[2]" arr3="Column[3]}'

結果讓我感到驚訝(注意到我對 Ed 的評論)

s=1 2 3 arr1=1 arr2=2 arr3=3

上面清楚地顯示了數組中的拆分,但我認為s會為每個三元運算符連接包含 $,即“$1 $2 $3”

此外,我希望 append 實際文件到上面的命令,我發現它允許我使用echo $string | awk '{program}' file.name

注意,我的問題被標記為 -1 表示研究工作很少,這有點侮辱人,因為我花了幾天時間試圖解決這個問題。

考慮到上面的所有信息,我認為s 的結果是“1 2 3”,但是打印不接受它,就像它從 function 調用時一樣,只是嘗試“打印 1 2 3”與文件的關系,這似乎是我所有努力的結果。 這真的讓我感到困惑,因為 Ed 的“對角線”示例在命令行中運行,表明“print s”的概念在與文件名輸入一起使用時絕對沒問題。 誰能建議這(下面的示例)如何工作?

我不知道是否嚴格允許使用 echo pipe 並附加文件名,但它似乎有效(???!?!)

(失敗的結果) echo $Fields | awk -F "," '{n=split($0,Column," "); 對於(i=1;i<=n;i++)s = 長度(s)? s OFS $(Column[i]): $(Column[i])}END{print s}' myfile.txt

這似乎是 go 通過 myfile.txt 和 output 所有包含許多逗號分隔值的行,即整個文件(我沒有包含這些值,只是為了說明),,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

這是在做什么; s = length(s)? s OFS $(C[i]): $(C[i])

您遇到了一個三元運算符,它具有以下語法

condition ? valueiftrue : valueiffalse

length function,當提供單個參數時確實返回字符數,在 GNU AWK integer 中 0 被認為是 false,其他整數被認為是 true,所以在這種情況下它不是空檢查。 s不為空時(它可能還沒有初始化,因為 GNU AWK在這種情況下將假定為空字符串),它與 output 字段分隔符( OFS ,默認為空格)和C[i] -th 字段值和分配給變量s ,當sC[i]第一個字段值的空值時。 多次使用這允許構建由OFS剪切的值字符串,考慮以下簡單示例,假設您想要獲取 2D 矩陣的對角線,存儲在file.txt中,內容如下

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

那么你可能會做

awk '{s = length(s) ? s OFS $(NR) : $(NR)}END{print s}' file.txt

這將得到 output

1 7 13 19 25

說明: NR是數字行,所以第 1 行$(NR)是第 1 個字段,第 2 行是第 2 個字段,第 3 個是第 3 個字段,依此類推

(在 GNU Awk 5.0.1 中測試)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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