Использование awk для удаления нескольких строк с использованием аргумента, переданного через функцию - PullRequest
0 голосов
/ 01 ноября 2018

Мой файл input.csv разделен точкой с запятой, причем первая строка является заголовком для атрибутов. Первый столбец содержит номера клиентов. Функция вызывается через скрипт, который я активирую из терминала.

Я хочу удалить все строки, содержащие номера клиентов, которые вводятся в качестве аргументов для скрипта. РЕДАКТИРОВАТЬ: а затем экспортировать файл в другой файл, сохранив исходный файл без изменений.

bash deleteCustomers.sh 1 3 5

В настоящее время только последний аргумент фильтруется из файла CSV. Я понимаю, что это происходит потому, что выходной файл перезаписывается при каждом запуске цикла, восстанавливая все ранее удаленные аргументы.

Как мне сопоставить все строки, которые нужно удалить, а затем удалить их (или распечатать все, НО эти строки), а затем вывести его в один файл, содержащий ВСЕ правки?

delete_customers () {
    echo "These customers will be deleted: "$@""       

for i in "$@";
do
    awk -F ";" -v customerNR=$i -v input="$inputFile" '($1 != customerNR) NR > 1 { print }' "input.csv" > output.csv
done
}

delete_customers "$@"

Вот несколько примеров ввода (первый фрагмент кода - первая строка в файле csv). В выходном CSV-файле я хочу использовать такое же форматирование, при этом строки для некоторых клиентов будут полностью удалены.

Klantnummer;Nationaliteit;Geslacht;Title;Voornaam;MiddleInitial;Achternaam;Adres;Stad;Provincie;Provincie-voluit;Postcode;Land;Land-voluit;email;gebruikersnaam;wachtwoord;Collectief ;label;ingangsdatum;pakket;aanvullende verzekering;status;saldo;geboortedatum

1;Dutch;female;Ms.;Josanne;S;van der Rijst;Bliek 189;Hellevoetsluis;ZH;Zuid-Holland;3225 XC;NL;Netherlands;JosannevanderRijst@dayrep.com;Sourawaspen;Lae0phaxee;Klant;CZ;11-7-2010;best;tand1;verleden;-137;30-12-1995

2;Dutch;female;Mrs.;Inci;K;du Bois;Castorweg 173;Hengelo;OV;Overijssel;7557 KL;NL;Netherlands;InciduBois@gustr.com;Hisfireeness;jee0zeiChoh;Klant;CZ;30-8-2015;goed ;geen;verleden;188;1-8-1960

3;Dutch;female;Mrs.;Lusanne;G;Hijlkema;Plutostraat 198;Den Haag;ZH;Zuid-Holland;2516 AL;NL;Netherlands;LusanneHijlkema@dayrep.com;Digum1969;eiTeThun6th;Klant;Achmea;12-2-2010;best;mix;huidig;-335;9-3-1973

4;Dutch;female;Dr.;Husna;M;Hoegee;Tiendweg 89;Ameide;ZH;Zuid-Holland;4233 VW;NL;Netherlands;HusnaHoegee@fleckens.hu;Hatimon;goe5OhS4t;Klant;VGZ;9-8-2015;goed ;gezin;huidig;144;12-8-1962

5;Dutch;male;Mr.;Sieds;D;Verspeek;Willem Albert Scholtenstraat 38;Groningen;GR;Groningen;9711 XA;NL;Netherlands;SiedsVerspeek@armyspy.com;Thade1947;Taexiet9zo;Intern;CZ;17-2-2004;beter;geen;verleden;-49;12-10-1961

6;Dutch;female;Ms.;Nazmiye;R;van Spronsen;Noorderbreedte 180;Amsterdam;NH;Noord-Holland;1034 PK;NL;Netherlands;NazmiyevanSpronsen@jourrapide.com;Whinsed;Oz9ailei;Intern;VGZ;17-6-2003;beter;mix;huidig;178;8-3-1974

7;Dutch;female;Ms.;Livia;X;Breukers;Everlaan 182;Veenendaal;UT;Utrecht;3903

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Этот скрипт bash должен работать:

!/bin/bash 
FILTER="!/(^"$(echo "$@" | sed -e "s/ /\|^/g")")/ {print}" 
awk "$FILTER" input.csv > output.csv

Идея состоит в том, чтобы создать соответствующий ФИЛЬТР awk и затем использовать его.

При условии, что параметры вызова: 1 2 3, фильтр будет:! / (^ 1 | ^ 2 | ^ 3) / {print}

!: инвертировать соответствие

^: начало строки

Входные данные находятся в файле input.csv , а результат вывода - в файле output.csv .

0 голосов
/ 01 ноября 2018

Попробуйте это в цикле ..

переменная awk -v = $ var '$ 1! = Переменная' input.csv

awk       - to make decision based on columns
-v        - to use a variable into a awk command
variable  - store the value for awk to process
$var      - to search for a specific string in run-time
!=        - to check if not exist
input.csv - your input file

Это поведение awk, когда вы используете -v, он может работать с переменной во время выполнения и обеспечивать вывод, который не содержит переданного вами значения. Таким образом, вы получите все значения, которые не соответствуют вашей переменной. Надеюсь, это полезно. :)

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...