2014-08-27 40 views
-1

想要将第一个文件字段$ 4与第二个文件字段$ 1进行比较,并且将第一个文件字段$ 8与第二个文件字段$ 3进行比较。 然后从第一个文件和IF字段$ 1匹配打印匹配案例,然后从第二个文件打印对应字段$ 2, 字段$ 3匹配,然后从第二个文件打印相应字段$ 4。比较两个文件和两个字段 - 续:

Input.csv

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee 
ABCD,SSS,EFG,1234,9999,2345,AB,30,1,4,1 
ABCD,SSS,EFG,1234,9999,2345,AB,40,2,5,2 
ABCD,SSS,EFG,1234,9999,2345,AB,60,3,6,3 
ABCD,SSS,EFG,3456,9999,2345,AB,30,1,4,1 
ABCD,SSS,EFG,3456,9999,2345,AB,40,2,5,2 
ABCD,SSS,EFG,3456,9999,2345,AB,60,3,6,3 
ABCD,SSS,EFG,5678,9999,2345,AB,30,1,4,1 
ABCD,SSS,EFG,5678,9999,2345,AB,40,2,5,2 
ABCD,SSS,EFG,5678,9999,2345,AB,60,3,6,3 

master.csv

SendMobNum,Year,Amount,Gender 
1234,2000,30,Male 
5678,2001,15,Female 
2345,2002,60,Female 
4567,2003 
8888,2004 

所需的输出:

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee,SendMobNum,Year,Amount,Gender 
ABCD,SSS,EFG,1234,9999,2345,AB,30,1,4,1,1234,2000,30,Male 
ABCD,SSS,EFG,1234,9999,2345,AB,60,3,6,3,1234,2000,60,Female 
ABCD,SSS,EFG,5678,9999,2345,AB,30,1,4,1,5678,2001,30,Male 
ABCD,SSS,EFG,5678,9999,2345,AB,60,3,6,3,5678,2001,60,Female 

是否尝试以下命令和部分:

awk -F, ' 
    NR == FNR {send[$1]; amt[$3]; next} 
    FNR == 1 || ($4 in send && $8 in amt) { print $0","send[$1] ","send[$2]","amt[$3]","amt[$4]} 
' master.csv Input*.csv 

任何建议...

编辑:想治疗mater.csv作为两个不同的数据集,

集#1

SendMobNum,Year(i.e Desc of SendMobNum) 
1234,2000 
5678,2001 
2345,2002 
4567,2003 
8888,2004 

集#2

Amount,Gender (i.e Desc of Amount) 
30,Male 
15,Female 
60,Female 

示例#1:如果Input.Field $ 4 == 1234和Input.Field $ 8 == 30

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee 
ABCD,SSS,EFG,1234,9999,2345,AB,30,1,4,1 

运算#1:

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee,SendMobNum,Year,Amount,Gender 
ABCD,SSS,EFG,1234,9999,2345,AB,30,1,4,1,1234,2000,30,Male 

实施例#2:如果Input.Field $ 4 == 1234和Input.Field $ 8 == 15

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee 
ABCD,SSS,EFG,1234,9999,2345,AB,15,1,4,1 

运算#2:

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee,SendMobNum,Year,Amount,Gender 
ABCD,SSS,EFG,1234,9999,2345,AB,15,1,4,1,1234,2000,15,Female 

示例#3:如果Input.Field $ 4 == 1234和Input.Field $ 8 == 60,则打印第二个文件1234,2000,60,女

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee 
ABCD,SSS,EFG,1234,9999,2345,AB,60,1,4,1 

运算#3:

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee,SendMobNum,Year,Amount,Gender 
ABCD,SSS,EFG,1234,9999,2345,AB,60,1,4,1,1234,2000,60,Female 

更新:2014年8月28日

哇,非常感谢埃德莫顿非常好的提示,全国联保! 我尝试过试用和错误的基础,得到下面的输出。 我在使用数组时遇到困惑,无法理解数组的概念,如何调试或检查命令,是否正在访问第一个文件第一行然后检查第二个文件的整个文件等等......

尝试#1 :(没有$ 1 & $ 3从主。CSV)

awk ' 
    BEGIN{ FS=OFS="," } 
    NR == FNR { mob2year[$1]=$2;amt2gender[$3]=$4; next} 
    FNR == 1 || ($4 in mob2year && $8 in amt2gender) { print $0,mob2year[$4],amt2gender[$8] } 
' Master.txt Input*.txt 

输出:

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee,Year,Gender 
ABCD,SSS,EFG,1234,9999,2345,AB,30,1,4,1,2000,Male 
ABCD,SSS,EFG,1234,9999,2345,AB,60,3,6,3,2000,Female 
ABCD,SSS,EFG,5678,9999,2345,AB,30,1,4,1,2001,Male 
ABCD,SSS,EFG,5678,9999,2345,AB,60,3,6,3,2001,Female 

尝试#2:(无$ 1 & $ 3从master.csv但填充从Input.csv的信息)想知道如何打印$ 1 $ 3从master.csv

awk ' 
    BEGIN{ FS=OFS="," } 
    NR == FNR { mob2year[$1]=$2;amt2gender[$3]=$4; next} 
    FNR == 1 || ($4 in mob2year && $8 in amt2gender) { print $0,$4,mob2year[$4],$8,amt2gender[$8] } 
' Master.txt Input*.txt 

输出:

Transaction ID,Request source,User name,SendMobNum,RecMobNum,ServiceClass,Service,Amount,CreditAmount,Bonus,Process fee,SendMobNum,Year,Amount,Gender 
ABCD,SSS,EFG,1234,9999,2345,AB,30,1,4,1,1234,2000,30,Male 
ABCD,SSS,EFG,1234,9999,2345,AB,60,3,6,3,1234,2000,60,Female 
ABCD,SSS,EFG,5678,9999,2345,AB,30,1,4,1,5678,2001,30,Male 
ABCD,SSS,EFG,5678,9999,2345,AB,60,3,6,3,5678,2001,60,Female 

评论:

awk ' 
    BEGIN{ FS=OFS="," }      'Assign Input/Output separator as "," 
    NR == FNR { mob2year[$1]=$2;amt2gender[$3]=$4; next} 'Create array mob2year and store $1 & $2 unique values from Master.txt then Create array amt2gender and store $3 & $4 unique values from Master.txt 
            'Read all the lines from Master.txt store into mob2year and amt2gender 
    FNR == 1 || ($4 in mob2year && $8 in amt2gender)  'If NR==1 OR ($4 from Input.txt in mob2year array AND $8 from amt2gender) then 
     { print $0,$4,mob2year[$4],$8,amt2gender[$8] }  'print entire line from Input.txt ($0) , $4 from Input.txt, $8 from Input.txt 
            'Not able to understand mob2year[$4] and amt2gender[$8] logic values 
' Master.txt Input*.txt 

回答

1

我真的觉得你可以自己做到这一点,但这里有一个提示:您想Master.csv像对待2组不同的数据,以便从中填充2个不同的阵列, mob2year[$1]=$2amt2gender[$3]=$4。现在,当您阅读Input.csv时,只需通过mob2year[$4]amt2gender[$8]即可访问这些文件。尝试使用该提示自行创建脚本,并在测试后使用脚本更新您的问题,并在需要帮助时留下评论。

也许这将帮助你理解关联数组:

$ cat file1 
fruit apple 
color red 
size large 
$ 
$ cat file2 
size fruit garbage color 
$ 
$ awk 'NR==FNR{ a[$1]=$2; next} {print $1, a[$1]}' file1 file2 
size large 
$ awk 'NR==FNR{ a[$1]=$2; next} {print $2, a[$2]}' file1 file2 
fruit apple 
$ awk 'NR==FNR{ a[$1]=$2; next} {print $3, a[$3]}' file1 file2 
garbage 
$ awk 'NR==FNR{ a[$1]=$2; next} {print $4, a[$4]}' file1 file2 
color red 
$ awk 'NR==FNR{ a[$1]=$2; next} {print $5, a[$5]}' file1 file2 

$ 

播放上述内容,增加一些版画等

+0

埃德莫顿,感谢输入,对不起,我没有得到如何打印字段来自Master.csv。 – VNA 2014-08-27 18:45:00

+0

Ed Morton,想将master.csv作为两组参考表,一组是前两个字段,另一组是第三和第四个字段 – VNA 2014-08-27 19:01:19

+0

例如, 如果Input.Field $ 4 = = 1234和Input.Field $ 8 == 30然后打印第二个文件1234,2000,30,男 如果输入。 Field $ 4 == 1234和Input.Field $ 8 == 15然后打印第二个文件1234,2000,15,女性 如果Input.Field $ 4 == 1234和Input.Field $ 8 == 60,则打印第二个文件1234,2000,60 ,女 – VNA 2014-08-27 19:09:21