我有这样的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
答案 0 :(得分:4)
只需slice the variable into array indexes:
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
答案 1 :(得分:0)
grep -E "$( echo "${val}"| sed 's/ /|/g' )" YourFile
# or
awk -v val="${val}" 'BEGIN{gsub(/ /, "|",val)} $1 ~ val' YourFile
grep的:
-E
的扩展版本)来过滤包含该值的所有行。正则表达式在子shell中构建OnTheMove,其中sed用|
替换空格分隔符,意思是 OR awk中:
val
|
BEGIN{gsub(/ /, "|",val)}
的空格(在 val 中)
$1 ~ val
的过滤器的defaut操作。