如何获取awk数组中的索引值

时间:2014-12-21 11:35:32

标签: awk

我有这个数据,其中1美元,2美元来自3美元,4美元,8美元的不同来源。 1美元,3美元是相似的,只是没有排序: -

code :name :     code: type <br/>
0555:GeoLocate:2754:GSM:MT:SMS:Charge:5:<br/>
930:topup:6463:GSM:MT:SMS:Charge:5:<br/> 
234:ota:3744:GSM:MT:SMS:Charge:0:<br/>
2000:FA_ussd:744:GSM:MT:SMS:Charge:0:<br/>
1450:IMPT:5434:GSM:MT:SMS:Charge:0: <br/>
1450:IMPT:930:GSM:MT:SMS:Charge:0:<br/>
5551:adt:1450:GSM:MT:SMS:Charge:10:<br/>

我需要以这种格式组织它们: -

1450 IMPT GSM MT短信费用10

使用: -

BEGIN{
FS=":";
}
{
a[$1]++;
for (x in a){
if($3 == x){
b[$2]++;
print x,b[a[x]],$4,$5,$6,$7,$8;
}
}
}

但是当我跑这个时,

$ awk -f awkscript.awk sampleData
b [a [x]]的

输出为空:
1450 GSM MT短信费10 930 GSM MT短信费用0
如何在数组b中获取IMPT的索引,因为它与?

中的x具有相同的索引

1 个答案:

答案 0 :(得分:1)

假设我理解正确(请参阅我对原始问题的评论),您可以尝试以下方法:

bash-3.2$ cat sample.data
0555:GeoLocate:2754:GSM:MT:SMS:Charge:5:<br/>
930:topup:6463:GSM:MT:SMS:Charge:5:<br/> 
234:ota:3744:GSM:MT:SMS:Charge:0:<br/>
2000:FA_ussd:744:GSM:MT:SMS:Charge:0:<br/>
1450:IMPT:5434:GSM:MT:SMS:Charge:0: <br/>
1450:IMPT:930:GSM:MT:SMS:Charge:0:<br/>
5551:adt:1450:GSM:MT:SMS:Charge:10:<br/>


bash-3.2$ awk -F: 'NR == FNR { a[$1] = $2; next } { print $3, a[$3]?a[$3]:"(not found)", $4, $5, $6, $7, $8 }' sample.data sample.data
2754 (not found) GSM MT SMS Charge 5
6463 (not found) GSM MT SMS Charge 5
3744 (not found) GSM MT SMS Charge 0
744 (not found) GSM MT SMS Charge 0
5434 (not found) GSM MT SMS Charge 0
930 topup GSM MT SMS Charge 0
1450 IMPT GSM MT SMS Charge 10

请注意,我们在命令行上提供了两次相同的sample.data文件。第一遍构建索引,第二遍使用该索引打印输出。还有一个问题是,如果3美元在文件中的任何地方都不会出现$ 1,该怎么办。在这里它只是打印&#34;(未找到)&#34;在那种情况下。

修改

为避免找不到&#34;未找到&#34; s,您可以使用上述awk的这种变体:

bash-3.2$ awk -F: 'NR == FNR { a[$1] = $2; next } { if (a[$3]) print $3, a[$3], $4, $5, $6, $7, $8 }' sample.data sample.data
930 topup GSM MT SMS Charge 0
1450 IMPT GSM MT SMS Charge 10