Shell 使用awk查找和插入数据

Shell 使用awk查找和插入数据,shell,awk,sed,bsd,Shell,Awk,Sed,Bsd,在我继续不使用MS Excel的过程中,我想处理一些数据,将其发送到一个文件,然后使用字段$1作为索引将一些记录从一个单独的文件插入第三个文件。这可能吗 我有这样的数据: 2600,foo,stack,1,04/02/2015,ACH Payment,ACH Settled,1500 2600,foo,stack,2,04/06/2015,Credit Card Sale,Settled,100 2600,foo,stack,3,04/07/2015,Credit Card Sale,Settl

在我继续不使用MS Excel的过程中,我想处理一些数据,将其发送到一个文件,然后使用字段$1作为索引将一些记录从一个单独的文件插入第三个文件。这可能吗

我有这样的数据:

2600,foo,stack,1,04/02/2015,ACH Payment,ACH Settled,1500
2600,foo,stack,2,04/06/2015,Credit Card Sale,Settled,100
2600,foo,stack,3,04/07/2015,Credit Card Sale,Settled,157.13
2600,foo,stack,4,04/07/2015,ACH Credit,ACH Settled,.03
2600,foo,stack,4
2600,foo,stack,4,.2,19.8
我将其分组:

cat group.awk
#!/usr/bin/awk -f

BEGIN {
    OFS = FS = ","
}
NR > 1 {
    arr[$1 OFS $2 OFS $3]++
}
END {
    for (key in arr)
        print key, arr[key]
}
该组织的做法如下:

2600,foo,stack,1,04/02/2015,ACH Payment,ACH Settled,1500
2600,foo,stack,2,04/06/2015,Credit Card Sale,Settled,100
2600,foo,stack,3,04/07/2015,Credit Card Sale,Settled,157.13
2600,foo,stack,4,04/07/2015,ACH Credit,ACH Settled,.03
2600,foo,stack,4
2600,foo,stack,4,.2,19.8
简单乘法适用于字段5、6和7,具体取决于字段3

在本例中,我们可以说完成的记录如下所示:

2600,foo,stack,1,04/02/2015,ACH Payment,ACH Settled,1500
2600,foo,stack,2,04/06/2015,Credit Card Sale,Settled,100
2600,foo,stack,3,04/07/2015,Credit Card Sale,Settled,157.13
2600,foo,stack,4,04/07/2015,ACH Credit,ACH Settled,.03
2600,foo,stack,4
2600,foo,stack,4,.2,19.8
现在在另一个文件中,我有以下数据:

2600,注册用户,5hPASLJlHlgJR4AQc9sZQ==

基本流程是:

awk-f group.awk data.csv | awk-f math.awk>finished.csv

然后使用awk(如果可以的话)在finished.csv中查找字段$1,并在单独的文件(bill.csv)中找到上面相应的记录,然后打印到第三个文件或插入bill.csv

第三个文件(bill.csv)中的预期输出:

x、 y、、1111111、RS、z、a将预填充到I,只需插入三条新记录

这是awk可以做到的吗

编辑

字段$3是将乘法设置为5、6和7的accountID

我的想法是:

bill.awk:

NR>1{if($3=="stack" && $4>199) $5=$4*0.03; 
if($3=="stack" && $4<200) $5=$4*0.05
if($3=="user") $5=$4*.01
}1
4*.05=0.2和20-.2=19.8

但最低收费是20美元

因此,我们将纠正它:

4*.05 = .2 & 20 - .2 = 20
额外填充的字段来自一个单独的文件(bill.csv),我需要在bill.csv上的正确记录中填写20

bill.csv包含除20之外所需的所有内容

之前:

x,y,,1111111,2600,,,,,,,,,,,registered user,,,,,,,,,,RS,,,N5hPASLJlHlgJR4AQc9sZQ==,z,a
之后:

x,y,,1111111,2600,,,,,,,20,,,registered user,,,,,,,,,,RS,,,N5hPASLJlHlgJR4AQc9sZQ==,z,a

这是更好的解释吗?假设group.awk、bill.awk和total.awk工作正常。我只需要提取字段$1的正确总数,并将其放入bill.csv中的正确位置。

也许这是您需要的最后一个awk。我试着去理解你想要什么,我想这就是你想要的方式:

解释:我们首先将文件A保存在一个数组中,第一个键作为索引。然后,如果字段1位于数组的索引之间,我们搜索文件B的每一行,如果是,我们将两个文件中的所有数据一起打印

awk -F"," 'BEGIN {while (getline < "record.dat"){ a[$1]=$0; }} {if($1 in a){ print a[$1]","$0}}' file.dat
2600,foo,stack,4,10,10.4,2600,registered user,5hPASLJlHlgJR4AQc9sZQ==
awk-F“,“'BEGIN{while(getline<“record.dat”){a[$1]=$0;}}{if($a中的$1){print a[$1],“$0}}}”file.dat
2600,foo,stack,4,10,10.42600,注册用户,5hPASLJlHlgJR4AQc9sZQ==

这是您需要的解决方案:

$ cat fileA
2600,foo,stack,1,04/02/2015,ACH Payment,ACH Settled,1500
2600,foo,stack,2,04/06/2015,Credit Card Sale,Settled,100
2600,foo,stack,3,04/07/2015,Credit Card Sale,Settled,157.13
2600,foo,stack,4,04/07/2015,ACH Credit,ACH Settled,.03
2600,foo,stack,5,04/09/2015,ACH Payment,ACH Settled,147.10

$ cat fileB
2600,registered user,5hPASLJlHlgJR4AQc9sZQ==

$ cat tst.awk
BEGIN { FS=OFS="," }
NR==FNR{
    cnts[$1][$2FS$3]++
    next
}
{
    for (val in cnts[$1]) {
        cnt = cnts[$1][val]
        print $1, val, cnt, cnt*2.5, $2, $3
    }
}

$ awk -f tst.awk fileA fileB
2600,foo,stack,5,12.5,registered user,5hPASLJlHlgJR4AQc9sZQ==
但在你更新你的问题之前,我们无法提供比这更具体的帮助


上面使用GNU awk 4.*表示真正的2D数组。

如果由于任何原因无法读取
record.dat
,则会进入无限循环。不要使用getline,除非它是一个特定的、适当的应用程序,并且您已经阅读并完全理解了它。脚本还有其他非awkishness问题。您的输入文件有5行,以
2600,foo,stack
开头,那么为什么第一个中间输出以4
2600,foo,stack,4
结尾?你说,
简单乘法适用于字段5、6和7,具体取决于字段3。
但字段3是文本字符串(
堆栈
),除非你告诉我们乘法是什么,否则我们无法编写脚本。最终输出中所有额外填充的空字段(
x,y,,1111111 2600,,,,,,,,,,10.4,,,注册用户,,,,,,,,,RS,,,N5hPASLJlHlgJR4AQc9sZQ=,z,a
)从哪里来,
foo,stack,4
到哪里去了?输入的第四条记录(
2600,foo,stack,404/07/2015,ACH信用,ACH结算,.03
)比其他的少1个字段,对吗?wrt
x,y,,1111111,RS,z,a将预填充到哪个文件中<代码>我只需要插入三条新记录
-哪些新记录(或您指的是新字段)?请澄清您的问题,以显示精确的、可测试的输入文件以及实际相关的输出和算法。下面是一些更多的数据:一个好的完成记录看起来是这样的:2601,FOS-拉斯维加斯,stack,468,23.4,0,23.4,我只需要将23.4取出,并根据2601将其插入bill.csv。实际上,我有一个完整的文件(文件.csv)需要从中提取一条信息,我需要把它放在bill.csv中,在file.csv中有一个匹配的字段$1。这可能吗?是的,任何事情都可能。你从名为
group.awk
math.awk
的两个awk脚本开始,不清楚为什么你有两个单独的脚本.blus文件名为
data.csv
finished.csv
。您更新的问题现在还有
bill.awk
total.awk
、和
bill.csv
。这已经够让人困惑的了,我都懒得去想什么是相关的,什么是不相关的。祝您好运!