簡體   English   中英

將bash變量用作awk中的數組,並通過與數組比較來過濾輸入文件

[英]Use bash variable as array in awk and filter input file by comparing with array

我有這樣的bash變量:

val="abc jkl pqr"

我有一個看起來像這樣的文件:

abc   4   5
abc   8   8
def   43  4
def   7   51
jkl   4   0
mno   32  2
mno   9   2
pqr   12  1

我想扔掉文件中第一個字段不在val中的行:

abc   4   5
abc   8   8
jkl   4   0
pqr   12  1

我在awk中的解決方案根本不起作用,我也不知道為什么:

awk -v var="${val}" 'BEGIN{split(var, arr)}$1 in arr{print $0}' file

只需將變量切成數組索引

awk -v var="${val}" 'BEGIN{split(var, arr)
                           for (i in arr) 
                               names[arr[i]]
                     }
                     $1 in names' file

如鏈接問題中所述,當您調用split()您將獲得數組的值,而您要設置的是索引。 技巧是使用此內容生成另一個數組。

如您所見$1 in names就足夠了,您不必在發生這種情況時就調用操作{print $0} ,因為它是默認操作。

作為單線:

$ awk -v var="${val}" 'BEGIN{split(var, arr); for (i in arr) names[arr[i]]} $1 in names' file
abc   4   5
abc   8   8
jkl   4   0
pqr   12  1
grep -E "$( echo "${val}"| sed 's/ /|/g' )" YourFile

# or

awk -v val="${val}" 'BEGIN{gsub(/ /, "|",val)} $1 ~ val' YourFile

grep的:

  • 它使用正則表達式(帶選項-E擴展版本)過濾包含該值的所有行。 正則表達式是在帶有sed的子外殼中構建OnTheMove的,用sed替換空格分隔符| 意義

AWK:

  • 使用與grep相同的原理,但一切都在內部完成(因此沒有子外殼)
  • 使用分配給同名shell變量的變量val
  • 在腳本開始時(在讀取第一行之前),通過|更改空格(在val中| BEGIN{gsub(/ /, "|",val)}
  • 然后,對於第一個字段(默認字段分隔符是awk中的空格/空白,所以第一個是字母組)匹配的每一行,打印它( $1 ~ val 1〜val的過濾器的默認操作)。

暫無
暫無

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

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