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
отображаются как:
- когда они отображаются в виде пар (LOCAL / REMOTE), если 3-е поле
MLOCAL
и 4-е полеMREMOTE
тогда 5-е и 7-е поле представляют значение и датуMLOCAL
и 6-й и 8-й представляют значение и датуMREMOTE
- когда они отображаются как одиночные (только
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
, CLIENT
5242881
, 64
, subscriber
567743
, 24
, visitor
data.csv
NAME
, 64
, MLOCAL
, 341993
, 23/10/2012
NAME
, 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
и если вы опубликуете ожидаемый результат, мы можем помочь вам больше.