一次完成多个awk程序

一次完成多个awk程序,awk,sed,gawk,Awk,Sed,Gawk,对于数据文件sampleTest1.dat Type,^*p,Pl@nt_!d,C^*mp@nyC^*de,S@P_Pr^*f!t_Center,USF_BrC^*de,D!v_Nbr,N@meSh^*rt,N@mePr^*per,@ddress1,@ddress2,_C!ty,Reg!^*n,P^*st@lC^*de,C^*untry,Ph^*ne,@C_Type,Sh@red_Fl@g_@C @C,1,1220,1410,US0001,,,J@CKS^*N,"_ J@CKS^*N, LLC"

对于数据文件sampleTest1.dat

Type,^*p,Pl@nt_!d,C^*mp@nyC^*de,S@P_Pr^*f!t_Center,USF_BrC^*de,D!v_Nbr,N@meSh^*rt,N@mePr^*per,@ddress1,@ddress2,_C!ty,Reg!^*n,P^*st@lC^*de,C^*untry,Ph^*ne,@C_Type,Sh@red_Fl@g_@C
@C,1,1220,1410,US0001,,,J@CKS^*N,"_ J@CKS^*N, LLC",44 M!LW@UKEE STREET,,J@CKS^*N,MS,320683,US@,60135411,B,Y
@C,3,1225,1400,US0003,,,J@CKS^*NV!LLE,"_ J@CKS^*NV!LLE, !NC.",15 LEW!S !NDUSTR!@L R^*@D,,J@CKS^*NV!LLE,FL,32540000,US@,,B,Y
@C,4,1095,1400,US0004,,,CENTR@@#L C@L!F^*RN!@,"_ CENTR@L C@L!F^*RN!@, !NC.",13 M@R!P^*S@ R^*@D,,M^*DEST^*,C@,95340000,US@,,B,Y
@C,5,1210,1400,US0005,,,!NTERM*UNT@!N,"_ !NTERM^*UNT@!N, !NC.",949 S^*UTH PR^*SPER!TY,,WEST J^*RD@N,UT,8408100,US@,,,N
@C,6,1150,1400,US0006,,,N^*RTH# &EX@S,"_ N^*RTH TEX@S, !NC.",80 TR!N!TY DR!VE,P.^*. B^*X 561000,LEW!SV!LLE,TX,7560000,US@,4646000,,N
现在,对于这些数据,您可以清楚地看到分隔符是','

现在我想做的是

  • 要删除的特殊字符,除了_
  • 使用驼峰案例,例如德克萨斯->德克萨斯
  • 对于$5(第5个字段),我想使用8个填充,除了001002005,例如003->00000003的值
  • 在$1和$2之间连接“\u”,例如键入行->键入行
因此,前两行的输出数据如下所示:

Type_P,Plntd,CmpnyCde,SP_Prft_Center,USF_BrCde,Dv_Nbr,NmeShrt,NmePrper,Ddress1,Ddress2,_Cty,Regn,PstCde,Cuntry,Phne,C_Type,Shred_Flg_C
C_1,1220,1410,US00000001,,,JCKSN,_JCKSN, LLC,44 MLWUKEE STREET,,JCKSN,MS,320683,US,60135411,B,Y
我几乎有所有的课程:

删除特殊字符

sed 's/[!@#\$%^&*()]//g' filename
骆驼案

{   text = $0;
    split(text, words, /[^a-zA-Z]+/);
    for (i=1; i<=length(words); i++) {
        res = res toupper(substr(words[i],1,1)) tolower(substr(words[i],2));
    }
    print res
}
对于附加
\uuu
,我们始终可以使用:

{print $1 "_" $2}

所以我的问题是:有没有其他方法可以一次完成所有这些任务?或者其他任何方式。但请仅使用awk和sed限制答案。

您发布的预期输出与您发布的输入不匹配,也不符合您声明的要求,因此这只是一个猜测,但可能这就是您想要的:

$ cat tst.awk
BEGIN { FS=OFS="," }
{
    gsub(/[^[:alnum:][:space:]_,]/,"")
    for (i=1;i<=NF;i++) {
        split($i,a,/ /)
        $i = ""
        for (j=1;j in a;j++) {
            $i = $i (j>1?" ":"") toupper(substr(a[j],1,1)) tolower(substr(a[j],2))
        }
    }
    match($5,/[[:digit:]]/)
    $5 = substr($5,1,RSTART-1) sprintf("%08d",substr($5,RSTART))
    sub(/,/,"_")
    print
}

$ awk -f tst.awk file
Type_P,Plnt_d,Cmpnycde,00000000,Usf_brcde,Dv_nbr,Nmeshrt,Nmeprper,Ddress1,Ddress2,_cty,Regn,Pstlcde,Cuntry,Phne,C_type,Shred_flg_c
C_1,1220,1410,Us00000001,,,Jcksn,_ Jcksn, Llc,44 Mlwukee Street,,Jcksn,Ms,320683,Us,60135411,B,Y
C_3,1225,1400,Us00000003,,,Jcksnvlle,_ Jcksnvlle, Nc,15 Lews Ndustrl Rd,,Jcksnvlle,Fl,32540000,Us,,B,Y
C_4,1095,1400,Us00000004,,,Centrl Clfrn,_ Centrl Clfrn, Nc,13 Mrps Rd,,Mdest,C,95340000,Us,,B,Y
C_5,1210,1400,Us00000005,,,Ntermuntn,_ Ntermuntn, Nc,949 Suth Prsperty,,West Jrdn,Ut,8408100,Us,,,N
C_6,1150,1400,Us00000006,,,Nrth Exs,_ Nrth Texs, Nc,80 Trnty Drve,P Bx 561000,Lewsvlle,Tx,7560000,Us,4646000,,N
$cat tst.awk
开始{FS=OFS=“,”}
{
gsub(/[^[:alnum:][:space:][uu,]/,“”)
对于(i=1;i1?“:”)toupper(substr(a[j],1,1))tolower(substr(a[j],2))
}
}
匹配($5,/[:digit:]/)
$5=substr($5,1,RSTART-1)sprintf(“%08d”,substr($5,RSTART))
子(/,/,“uu”)
打印
}
$awk-f tst.awk文件
类型P、Plnt、Cmpnycde、00000000、Usf brcde、Dv\U nbr、Nmeshrt、NMEPR、地址1、地址2、cty、注册表、Pstlcde、Cuntry、Phne、C类型、碎片
美国密西西比州Jcksn Mlwuke街44号Jcksn Jcksn有限责任公司,邮编:320683,美国,邮编:60135411
北卡罗来纳州,路易斯安那州,路易斯安杜斯特尔路15号,美国佛罗里达州,邮编:32540000
北卡罗来纳州中部Clfrn中心Clfrn,美国中西部Mrps路13号,邮编:95340000
C_512101400,Us00000005,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州,北卡罗来纳州
北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州北卡罗来纳州

如果没有,请修复所需的输出以进行澄清。

这听起来像是一大堆要做的事情。有些是困难的,但有些是琐碎的:到目前为止,你做了什么来解决(至少)琐碎的问题?这将是一个很好的起点,否则看起来你想让我们做一切:)我有所有的程序。例如,对于cample case{text=$0;split(text,words,/[^a-zA-Z]+/);for(i=1;请使用编辑按钮附加此有价值的信息。要删除特殊字符sed的/[!@\$%^&*())//但是问题是我不能把所有的sed都放在一个单独的程序文件中。因为这样可以解决一个接一个地调用它们的复杂性…我会再次更新这个问题。第一个sed可以通过说
gsub(/)?…/,“)
转换成awk,第二个使用
sprintf
。使用第一个awk代码(长的一个)并将其与
打印$1\u$2
一起添加就足够了。这并不是像OPs示例中所示的那样在
之后出现驼峰,但是示例中有一半的内容不符合他们的要求,所以可能它应该触发,也可能与OPs对“特殊”的定义不匹配当决定删除哪些“特殊字符”时。我真的不知道OP想要什么,但希望这足够简单,他可以修改它以适应,或者他们会发布真实的预期输出,然后我们可以帮助他们。现在我已经调整它,不将空格视为“特殊字符”字段中用空格分隔的单词。谢谢你的主意。
$ cat tst.awk
BEGIN { FS=OFS="," }
{
    gsub(/[^[:alnum:][:space:]_,]/,"")
    for (i=1;i<=NF;i++) {
        split($i,a,/ /)
        $i = ""
        for (j=1;j in a;j++) {
            $i = $i (j>1?" ":"") toupper(substr(a[j],1,1)) tolower(substr(a[j],2))
        }
    }
    match($5,/[[:digit:]]/)
    $5 = substr($5,1,RSTART-1) sprintf("%08d",substr($5,RSTART))
    sub(/,/,"_")
    print
}

$ awk -f tst.awk file
Type_P,Plnt_d,Cmpnycde,00000000,Usf_brcde,Dv_nbr,Nmeshrt,Nmeprper,Ddress1,Ddress2,_cty,Regn,Pstlcde,Cuntry,Phne,C_type,Shred_flg_c
C_1,1220,1410,Us00000001,,,Jcksn,_ Jcksn, Llc,44 Mlwukee Street,,Jcksn,Ms,320683,Us,60135411,B,Y
C_3,1225,1400,Us00000003,,,Jcksnvlle,_ Jcksnvlle, Nc,15 Lews Ndustrl Rd,,Jcksnvlle,Fl,32540000,Us,,B,Y
C_4,1095,1400,Us00000004,,,Centrl Clfrn,_ Centrl Clfrn, Nc,13 Mrps Rd,,Mdest,C,95340000,Us,,B,Y
C_5,1210,1400,Us00000005,,,Ntermuntn,_ Ntermuntn, Nc,949 Suth Prsperty,,West Jrdn,Ut,8408100,Us,,,N
C_6,1150,1400,Us00000006,,,Nrth Exs,_ Nrth Texs, Nc,80 Trnty Drve,P Bx 561000,Lewsvlle,Tx,7560000,Us,4646000,,N