使用awk通过通过函数

时间:2018-11-01 10:29:57

标签: linux bash shell awk terminal

我的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 :(得分:1)

循环尝试。

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时,它将可以在运行时与变量一起使用,并提供不包含您传递的值的输出。这样,您将获得与变量不匹配的所有值。希望这会有所帮助。 :)

谢谢

答案 1 :(得分:0)

此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 文件中。