带有模式数组的 awk 列

  • 本文关键字:awk 数组 模式 awk
  • 更新时间 :
  • 英文 :


是否可以这样做,但使用实际的字符串数组,其中显示"数组">

array=(cat
dog
mouse
fish
...)
awk -F "," '{ if ( $5!="array" ) { print $0; } }' file

我想在我的数组中的一些字符串中使用空格。 我还希望能够匹配部分匹配,因此我的数组中的"雪"将与"雪人"匹配 它应该区分大小写。

示例 csv

s,dog,34
3,cat,4
1,african elephant,gd
A,African Elephant,33
H,snowman,8
8,indian elephant,3k
7,Fish,94
...

示例数组

snow
dog
african elephant

预期产出

s,dog,34
H,snowman,8
1,african elephant,gd

Cyrus 发布了这个效果很好,但它不允许数组字符串中有空格并且不会匹配部分匹配。

echo "${array[@]}" | awk 'FNR==NR{len=split($0,a," "); next} {for(i=1;i<=len;i++) {if(a[i]==$2){next}} print}' FS=',' - file

对所有数组内容使用单个正则表达式的简要方法:

$ array=('snow' 'dog' 'african elephant')
$ printf '%sn' "${array[@]}" | awk -F, 'NR==FNR{r=r s $0; s="|"; next} $2~r' - example.csv
s,dog,34
1,african elephant,gd
H,snowman,8

或者,如果您更喜欢字符串比较:

$ cat tst.sh
#!/bin/env bash
array=('snow' 'dog' 'african elephant')
printf '%sn' "${array[@]}" |
awk -F',' '
NR==FNR {
array[$0]
next
}
{
for (val in array) {
if ( index($2,val) ) {      # or $2 ~ val for a regexp match
print
next
}
}
}
' - example.csv
$ ./tst.sh
s,dog,34
1,african elephant,gd
H,snowman,8

这不会打印包含第 5 列数组中元素的 csv 文件中的行:

echo "${array[@]}" | awk 'FNR==NR{len=split($0,a," "); next} {for(i=1;i<=len;i++) {if(a[i]==$5){next}} print}' FS=',' - file