awk устанавливает элементы в массиве

У меня есть большой файл.csv для обработки, и мои элементы расположены случайным образом, как это:

хххххх, хх, MLOCAL, MREMOTE, 33222, 56, 22/10/2012, 18/10/2012 хххххх, хх, MREMOTE, MLOCAL, 33222, 56, 22/10/2012, 18/10/2012 хххххх, хх, MLOCAL, 341993, 22/10/2012
хххххх, хх, MREMOTE , 9356828 , 08/10/2012
хххххх, хх, LOCAL, REMOTE, 19316, 15253, 22/10/2012, 22/10/2012
хххххх, хх, REMOTE, LOCAL, 1865871, 383666, 22/10/2012, 22/10/2012
хххххх, хх, REMOTE, 1180306134, 19/10/2012

где поля LOCAL, REMOTE, MLOCAL или же MREMOTE отображаются как:

  1. когда они отображаются в виде пар (LOCAL / REMOTE), если 3-е поле MLOCAL и 4-е поле MREMOTE тогда 5-е и 7-е поле представляют значение и дату MLOCAL и 6-й и 8-й представляют значение и дату MREMOTE
  2. когда они отображаются как одиночные (только LOCAL или только REMOTE) затем 4-е и 5-е поля представляют значение и дату поля 3.

Теперь я разделил эти строки, используя:

nawk 'BEGIN{

while (getline < "'"$filedata"'")
split($0,ft,",");
name=ft[1];
ID=ft[2]
 ?=ft[3]
 ?=ft[4]
....................

но поскольку я не могу найти шаблон для 3-го и 4-го полей, я довольно застрял, чтобы продолжать назначать имена переменных для каждого из элементов массива, чтобы использовать их для дальнейшей обработки.

Теперь я попытался использовать оператор case, но не работает для awk или nawk (только в gawk работает как положено). Я также попробовал это:

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];
..........................................

но это не работает так же хорошо.

Так что, если у вас есть идеи, как с этим справиться, я был бы благодарен, чтобы дать мне подсказку, чтобы иметь возможность найти шаблон, чтобы охватить все возможные ситуации сверху.

РЕДАКТИРОВАТЬ

Я не знаю, как поблагодарить вас за всю эту помощь. Теперь то, что я должен сделать, является более сложным, чем я написал выше, я постараюсь описать как можно проще, иначе я вас очень запутаю. Мой вывод должен выглядеть следующим образом:

NAME, UNIQUE_ID, VOLUME_ALOCATED, MLOCAL_VALUE, MLOCAL_TIMESTMP, MLOCAL_limit, LOCAL_VALUE, LOCAL_TIMESTAMP, LOCAL_limit, MREMOTE_VALUE, MREMOTE_TIMESTAMP, REMOTE_VALUE, REMOTE_TIMESTAMP

(где MLOCAL_limit а также LOCAL_limit результат вычитания между VOLUME_ALOCATED а также MLOCAL_VALUE или же LOCAL_VALUE)

Итак, в моем выходном файле положение полей должно быть расположено так: 4-е поле = MLOCAL_VALUE 5-е поле = MLOCAL_TIMESTMP 7-е поле = LOCAL_VALUE, 8-е поле = LOCAL_TIMESTAMP 10-е поле = MREMOTE_VALUE 11-е поле = MREMOTE_TIMESTAMP 12-е поле = REMOTE_VALUE 13-е поле = REMOTE_TIMESTAMP

Теперь пример будет таким: для следующего ввода: name, ID, VOLUME_ALLOCATED, MLOCAL, MREMOTE, 33222, 56, 22/10/2012, 18/10/2012

name, ID, VOLUME_ALLOCATED, REMOTE, 234455, 19/12/2012

Я должен обработать эту строку и вывод должен быть таким:

name, ID, VOLUME_ALLOCATED, 33222, 22/10/2012, MLOCAL_LIMIT, , , , 56, 18/10/2012, ,

7th, 8th, 9th, 12th, а также 13th поля пусты, потому что нет информации, связанной с: LOCAL_VALUE, LOCAL_TIMESTAMP, LOCAL_limit, REMOTE_VALUE, а также REMOTE_TIMESTAMP

ИЛИ ЖЕ

name, ID, VOLUME_ALLOCATED, , , , , , , , , 234455, 9/12/2012

4th, 5th, 6th, 7th, 8th, 9th, 10th а также, 11th, поля должны быть пустыми значениями, потому что нет информации о: MLOCAL_VALUE, MLOCAL_TIMESTAMP, MLOCAL_LIMIT, LOCAL_VALUE, LOCAL_TIMESTAMP, LOCAL_LIMIT, MREMOTE_VALUE, MREMOTE_TIMESTAMP

VOLUME_ALLOCATED извлекается из другого файла CSV (называемого "info.csv") на основе ID поле, которое обрабатывается ранее в скрипте, например:

info.csv

VOLUME_ALLOCATED, ID, CLIENT5242881, 64, subscriber567743, 24, visitor

data.csv

NAME, 64, MLOCAL, 341993, 23/10/2012NAME, 24, LOCAL $ REMOTE, 2347 $ 4324, 19/12/2012 $ 18/12/2012

Теперь мой код такой:

    #! /usr/bin/bash

input="info.csv"
filedata="data.csv"
outfile="out"

nawk 'BEGIN{
while (getline < "'"$input"'")
{
split($0,ft,",");
volume=ft[1];
id=ft[2];
client=ft[3];

key=id;
volumeArr[key]=volume;
clientArr[key]=client;
}
close("'"$input"'");

while (getline < "'"$filedata"'")
{
gsub(/\$/,","); # substitute the $ separator with comma
split($0,ft,",");
volume=volumeArr[id]; # Get the volume from the volumeArr, using "id" as key
segment=clientArr[id]; # Get the client mode from the clientArr, using "id" as key
NAME=ft[1];
id=ft[2];

здесь я застрял, я не могу найти правильный способ установить остальные поля, так как я не знаю, как обрабатывать 3-е и 4-е поля.

? =ft[3];
? =ft[4];

Извините, если я вас запутаю, но сейчас это моя текущая ситуация. Спасибо

1 ответ

Вы не предоставили ожидаемый результат от своего образца ввода, но вот для начала, чтобы показать, как получить значения для 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

и если вы опубликуете ожидаемый результат, мы можем помочь вам больше.

Другие вопросы по тегам