There is not really a need for an array. You could define your function like this:
delete() {
awk -v customer="^($1)\$" -F ";" '$1 !~ customer {print $ALL}' input.csv >output.csv
}
I didn't understand how you defined the field separator, so I changed it to be able to test. The relevant part is to use a negated regular expression !~
. Also I used the -v
parameter for awk that can save you from a lot of shell quoting headache.
With this you can use a parameter like this to delete multiple customers:
delete 'bla|foo'
For in input.csv like this:
bla;blu;bli
foo;faa;fii
blafoo;blufaa;blifii
it would yield
blafoo;blufaa;blifii
in output.csv.
If you really want to use an array you could in addition define a little helper function that prepares the array for use with the delete()
function above:
join() { local IFS=\|; echo "$*"; }
With this you are able to define a bash array and convert it to regex alternate syntax:
$ a=(bla blu)
$ join ${a[@]}
bla|blu
Then you could call delete()
like this:
$ a=(customer1 customer2)
$ delete "$(join ${a[@]})"
(Small side note for zsh users: the join()
function is not needed for zsh, you could simply use the following parameter expansion: ${(j:|:)a}
to join all array elements with the |
character)
$ALL
? How isprint $ALL
different fromprint
? And why are you passing$@
in single quotes? That means it won't be expanded.$@
(it's still not a good way to pass shell parameters to awk though)