awk在数组中设置元素

时间:2013-01-18 02:56:51

标签: csv if-statement awk case nawk

我有一个大的.csv文件要处理,我的元素按照这样随机排列:

XXXXXX,XX,的 MLOCAL MREMOTE 33222 { {1}} 56 22/10/2012 XXXXXX,XX, 18/10/2012 MREMOTE MLOCAL {{1} } 33222 56 XXXXXX,XX,的 22/10/2012 下,18/10/2012 MLOCAL
XXXXXX,XX, 34199322/10/2012MREMOTE
XXXXXX,XX,的 9356828 08/10/2012 LOCAL {{1} } REMOTE 19316
XXXXXX,XX, 15253 22/10/2012 22/10/2012 {{1} } REMOTE LOCAL
XXXXXX,XX,186587138366622/10/2012

其中字段 22/10/2012 REMOTE 1180306134 {{1 显示如下:

  1. 第三字段为19/10/2012第4时,它们显示为成对( LOCAL / REMOTE 字段为 LOCAL ,然后第5个第7个字段代表 {{1的值和日期 {{1>}
  2. 当它们显示为单个(仅 REMOTE 或仅 MLOCAL )时,第4个和第5个字段代表的值和日期第3场。
  3. 现在,我使用以下方法拆分这些行:

    MREMOTE

    但是因为我找不到第3和第4个字段的模式,所以我很难继续为每个数组元素分配var名称,以便将它们用于进一步处理。

    现在,我尝试使用“case”语句,但是不能用于awk或nawk(仅在gawk中按预期工作)。我也试过这个:

    MLOCAL

    但它的效果不佳。

    所以,如果你有任何想法如何处理这个问题,我将很感激地给我一个提示,以便能够找到一个模式,以便涵盖上面所有可能的情况。

    修改

    我不知道如何感谢你的帮助。现在,我要做的比上面写的更复杂,我会尽量简单地描述,否则我会让你们很困惑。 我的输出应该如下:

    MREMOTEMLOCALMREMOTELOCALREMOTEnawk 'BEGIN{ while (getline < "'"$filedata"'") split($0,ft,","); name=ft[1]; ID=ft[2] ?=ft[3] ?=ft[4] .................... if ( ft[3] == "MLOCAL" && ft[4]!= "MREMOTE" ) { MLOCAL=ft[3]; MLOCAL_qty=ft[4]; MLOCAL_TIMESTAMP=ft[5]; } else if ( ft[3] == MLOCAL && ft[4] == MREMOTE ) { MLOCAL=ft[3]; MREMOTE=ft[4]; MOCAL_qty=ft[5]; MREMOTE_qty=ft[6]; MOCAL_TIMESTAMP=ft[7]; MREMOTE_TIMESTAMP=ft[8]; } else if ( ft[3] == MREMOTE && ft[4] != MOCAL ) { MREMOTE=ft[3]; MREMOTE_qty=ft[4]; MREMOTE_TIMESTAMP=ft[5]; .......................................... NAMEUNIQUE_IDVOLUME_ALOCATEDMLOCAL_VALUEMLOCAL_TIMESTMPMLOCAL_limit

    (其中LOCAL_VALUELOCAL_TIMESTAMPLOCAL_limitMREMOTE_VALUEMREMOTE_TIMESTAMP之间的减法结果

    因此,在我的输出文件中,字段位置应该像: 第4个字段 = REMOTE_VALUE第5个字段 = REMOTE_TIMESTAMP第7个字段 = MLOCAL_limit第8个字段 = LOCAL_limit第10个字段 = VOLUME_ALOCATED第11个字段 = MLOCAL_VALUE第12个字段 = LOCAL_VALUE第13个字段 = MLOCAL_VALUE

    现在,一个例子是: 对于以下输入:MLOCAL_TIMESTMPLOCAL_VALUELOCAL_TIMESTAMPMREMOTE_VALUEMREMOTE_TIMESTAMPREMOTE_VALUEREMOTE_TIMESTAMP,{{1 }},name

    IDVOLUME_ALLOCATEDMLOCALMREMOTE3322256

    我应该处理这一行,输出应该是这样的:

    22/10/201218/10/2012name ID 下,VOLUME_ALLOCATEDREMOTE,{{1} },23445519/12/2012 name IDVOLUME_ALLOCATED33222

    22/10/2012MLOCAL_LIMIT字段为空,因为没有与56相关的信息, 18/10/20127th

    8th9th12th13thLOCAL_VALUELOCAL_TIMESTAMPLOCAL_limitREMOTE_VALUE REMOTE_TIMESTAMPnameIDVOLUME_ALLOCATED

    和{{1} },字段应为空值,因为没有关于以下内容的信息:2344559/12/20124th5th6th7th8th9th

    10th基于11th字段从其他csv文件(称为“info.csv”)中检索,该字段在脚本中先前处理过,如:

    info.csv

    MLOCAL_VALUEMLOCAL_TIMESTAMPMLOCAL_LIMIT   LOCAL_VALUELOCAL_TIMESTAMPLOCAL_LIMIT   MREMOTE_VALUEMREMOTE_TIMESTAMPVOLUME_ALLOCATED

    data.csv

    IDVOLUME_ALLOCATEDIDCLIENT5242881   64subscriber567743 $ 24visitor $ NAME64 $ MLOCAL

    现在,我的代码是:

    341993
      

    在这里我被卡住了,我找不到正确的方法来设置剩下的   因为我不知道如何处理第3和第4个字段。

    23/10/2012

    对不起,如果我让你很困惑,但这是我现在的情况。 感谢

1 个答案:

答案 0 :(得分:7)

您没有提供样本输入的预期输出,但这里是一个开始,展示如何获取2种不同格式的输入行的值:

$ cat tst.awk
BEGIN{ FS=","; OFS="\t" }
{
   delete value       # or use split("",value) if your awk cant delete arrays
   if ($4 ~ /LOCAL|REMOTE/) {
      value[$3] = $5
      date[$3]  = $7
      value[$4] = $6
      date[$4]  = $8
   }
   else {
      value[$3] = $4
      date[$3]  = $5
   }

   print
   for (type in value) {
      printf "%15s%15s%15s\n", type, value[type], date[type]
   }
}
$ awk -f tst.awk file
xxxxxx,xx,MLOCAL,MREMOTE,33222,56,22/10/2012,18/10/2012
        MREMOTE             56     18/10/2012
         MLOCAL          33222     22/10/2012
xxxxxx,xx,MREMOTE,MLOCAL,33222,56,22/10/2012,18/10/2012
        MREMOTE          33222     22/10/2012
         MLOCAL             56     18/10/2012
xxxxxx,xx,MLOCAL,*341993,22/10/2012*
         MLOCAL        *341993    22/10/2012*
xxxxxx,xx,MREMOTE,9356828,08/10/2012
        MREMOTE        9356828     08/10/2012
xxxxxx,xx,LOCAL,REMOTE,19316,15253,22/10/2012,22/10/2012
         REMOTE          15253     22/10/2012
          LOCAL          19316     22/10/2012
xxxxxx,xx,REMOTE,LOCAL,1865871,383666,22/10/2012,22/10/2012
         REMOTE        1865871     22/10/2012
          LOCAL         383666     22/10/2012
xxxxxx,xx,REMOTE,1180306134,19/10/2012
         REMOTE     1180306134     19/10/2012

如果您发布预期的输出,我们可以为您提供更多帮助。