是否可以这样做,但使用实际的字符串数组,其中显示"数组">
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