繁体   English   中英

使用awk通过通过函数传递的参数删除多行

[英]Using awk to delete multiple lines using argument passed on via function

我的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

循环尝试。

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

谢谢

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM