[英]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:
val
|
更改空格(在val中 ) |
與BEGIN{gsub(/ /, "|",val)}
$1 ~ val
1〜val的過濾器的默認操作)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.