Немає потреби в масиві. Ви можете визначити свою функцію так:
delete() {
awk -v customer="^($1)\$" -F ";" '$1 !~ customer {print $ALL}' input.csv >output.csv
}
Я не розумів, як ви визначили роздільник поля, тому змінив його, щоб мати можливість протестувати. Відповідна частина полягає у використанні заперечного регулярного виразу !~
. Також я використав -v
параметр для awk, який може врятувати вас від безлічі оболонок, котируючи головний біль.
За допомогою цього параметра можна використовувати такий параметр, щоб видалити декілька клієнтів:
delete 'bla|foo'
Для input.csv, як це:
bla;blu;bli
foo;faa;fii
blafoo;blufaa;blifii
це дасть урожай
blafoo;blufaa;blifii
у виході.csv.
Якщо ви дійсно хочете використовувати масив, ви можете додатково визначити невелику помічну функцію, яка готує масив до використання з delete()
функцією, наведеною вище:
join() { local IFS=\|; echo "$*"; }
За допомогою цього ви зможете визначити масив bash і перетворити його в альтернативний синтаксис регулярного вирівнювання:
$ a=(bla blu)
$ join ${a[@]}
bla|blu
Тоді ви можете зателефонувати delete()
так:
$ a=(customer1 customer2)
$ delete "$(join ${a[@]})"
(Маленька бічна примітка для користувачів zsh: join()
функція не потрібна для zsh, ви можете просто використовувати таке розширення параметрів: ${(j:|:)a}
щоб з'єднати всі елементи масиву з |
символом)
$ALL
? Чимprint $ALL
відрізняється відprint
? І чому ти передаєш$@
поодинокі цитати? Це означає, що вона не буде розширена.