我有一个大的.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, 341993
,22/10/2012
,MREMOTE
XXXXXX,XX,的 9356828
, 08/10/2012
, LOCAL
, {{1} } , REMOTE
, 19316
XXXXXX,XX, 15253
, 22/10/2012
, 22/10/2012
, {{1} } , REMOTE
, LOCAL
XXXXXX,XX,1865871
,383666
,22/10/2012
其中字段 22/10/2012
, REMOTE
, 1180306134
或 {{1 显示如下:
19/10/2012
且第4时,它们显示为成对( LOCAL / REMOTE ) 字段为 LOCAL
,然后第5个和第7个字段代表 {{1的值和日期 {{1>} REMOTE
或仅 MLOCAL
)时,第4个和第5个字段代表的值和日期第3场。现在,我使用以下方法拆分这些行:
MREMOTE
但是因为我找不到第3和第4个字段的模式,所以我很难继续为每个数组元素分配var名称,以便将它们用于进一步处理。
现在,我尝试使用“case”语句,但是不能用于awk或nawk(仅在gawk中按预期工作)。我也试过这个:
MLOCAL
但它的效果不佳。
所以,如果你有任何想法如何处理这个问题,我将很感激地给我一个提示,以便能够找到一个模式,以便涵盖上面所有可能的情况。
修改
我不知道如何感谢你的帮助。现在,我要做的比上面写的更复杂,我会尽量简单地描述,否则我会让你们很困惑。 我的输出应该如下:
MREMOTE
,MLOCAL
,MREMOTE
,LOCAL
,REMOTE
,nawk '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];
..........................................
,NAME
,UNIQUE_ID
,VOLUME_ALOCATED
,MLOCAL_VALUE
,MLOCAL_TIMESTMP
,MLOCAL_limit
(其中LOCAL_VALUE
和LOCAL_TIMESTAMP
是LOCAL_limit
与MREMOTE_VALUE
或MREMOTE_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_TIMESTMP
,LOCAL_VALUE
,LOCAL_TIMESTAMP
,MREMOTE_VALUE
,MREMOTE_TIMESTAMP
,REMOTE_VALUE
,REMOTE_TIMESTAMP
,{{1 }},name
ID
,VOLUME_ALLOCATED
,MLOCAL
,MREMOTE
,33222
,56
我应该处理这一行,输出应该是这样的:
22/10/2012
,18/10/2012
,name
, ID
下,VOLUME_ALLOCATED
,REMOTE
,{{1} },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
,
,
,
,
,
,
,
和{{1} },字段应为空值,因为没有关于以下内容的信息:
234455
,9/12/2012
,4th
,5th
,6th
,7th
, 8th
,9th
10th
基于11th
字段从其他csv文件(称为“info.csv”)中检索,该字段在脚本中先前处理过,如:
info.csv
MLOCAL_VALUE
,MLOCAL_TIMESTAMP
,MLOCAL_LIMIT
LOCAL_VALUE
,LOCAL_TIMESTAMP
,LOCAL_LIMIT
MREMOTE_VALUE
,MREMOTE_TIMESTAMP
,VOLUME_ALLOCATED
data.csv
ID
,VOLUME_ALLOCATED
,ID
,CLIENT
,5242881
64
,subscriber
,567743
$ 24
,visitor
$ NAME
,64
$ MLOCAL
现在,我的代码是:
341993
在这里我被卡住了,我找不到正确的方法来设置剩下的 因为我不知道如何处理第3和第4个字段。
23/10/2012
对不起,如果我让你很困惑,但这是我现在的情况。 感谢
答案 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
如果您发布预期的输出,我们可以为您提供更多帮助。