shell – 在unix中的两个固定格式文件中查找字段值 – 不起作用
发布时间:2020-12-15 22:32:31 所属栏目:安全 来源:网络整理
导读:我有2个固定长度的文件输入#1输入#2.我想根据两个文件中位置37-50的值来匹配行(pos 37-50在两个文件中都有相同的值). 如果找到任何匹配记录,则根据公司代码输入文件#1中的发票编号(位置99到行尾). 剪切字符串(来自输入#1)需要附加在记录/行的末尾. 下面是我
我有2个固定长度的文件输入#1&输入#2.我想根据两个文件中位置37-50的值来匹配行(pos 37-50在两个文件中都有相同的值).
如果找到任何匹配记录,则根据公司代码&输入文件#1中的发票编号(位置99到行尾). 剪切字符串(来自输入#1)需要附加在记录/行的末尾. 下面是我尝试过的代码(不工作)和输入文件&期望的输出.请提供您的建议. 码: awk ' NR==FNR && NF>1 { v=substr($0,37,14); #print substr($0,14) next } NR==FNR && ( /Company Code/ OR /Invoice Number/ ) { sub(/Company Code/,"",$0); sub(/Invoice Number/,$0); a[v]=$0; print $0 next } (substr($0,14) in a) { print $0 a[substr($0,99)] }' Input1.txt input2.txt input3.txt 结束代码 输入#1以一些空格开头的Start 612 2222222222201402120000 2 1 111 211 Due Date 20140101 612 2222222222201402120000 2 1 111 311 Company Code 227 612 2222222222201402120000 2 1 111 411 Item Code 12 612 2222222222201402120000 2 1 111 511 Invoice Number 2014010 612 2222222222201402120000 2 2 111 611 Company Code 214 612 2222222222201402120000 2 2 111 711 Item Code 20 612 2222222222201402120000 2 2 111 811 Invoice Number 3014010 612 2222222222201402120000 2 3 111 911 Due Date 20140101 612 2222222222201402120000 2 3 111 111 Invoice Number 40140101 612 2222222222201402120000 2 3 111 121 user code 15563263636 612 2222222222201402120000 2 3 111 131 Amount Due 100000 612 222222222220140212000078978982123444 111 141 Due Date 20140101 612 222222222220140212000078978982123444 111 151 Invoice Number 50140101 612 222222222220140212000078978982123444 111 161 Amount Due 008000 输入#1结束 输入#2开头 510 77432201111010000 2 1 1ChK 100111000001 121000248 123456789 20111101.510.77432.20001C 510 77432201111010000 2 1 2INv 20111101.510.77432.20001D 510 77432201111010000 2 1 3INv 20111101.510.77432.20002D 510 77432201111010000 2 1 4INv 20111101.510.77432.20003D 510 77432201111010000 2 1 5INv 20111101.510.77432.20004D 510 77432201111010000 2 2 1ChK 200111000002 121000248 123456789 20111101.510.77432.20002C 510 77432201111010000 2 2 2INv 20111101.510.77432.20005D 510 77432201111010000 2 2 3INv 20111101.510.77432.20006D 510 77432201111010000 2 2 4INv 20111101.510.77432.20007D 510 77432201111010000 2 2 5INv 20111101.510.77432.20008D 510 77432201111010000 2 3 1ChK 300111000003 121000248 123456789 20111101.510.77432.20003C 510 77432201111010000 2 3 2INv 20111101.510.77432.20009D 510 77432201111010000 2 3 3INv 20111101.510.77432.20010D 510 77432201111010000 2 3 4INv 20111101.510.77432.20011D 510 77432201111010000 2 6 1ChK 600111000006 121000248 123456789 20111101.510.77432.20006C 510 77432201111010000 2 6 2INv 20111101.510.77432.20021D 510 77432201111010000 2 6 3INv 20111101.510.77432.20022D 510 77432201111010000 2 6 4INv 20111101.510.77432.20023D 510 77432201111010000 2 6 5INv 20111101.510.77432.20024D 输入#2结束 渴望外出 510 77432201111010000 2 1 1ChK 100111000001 121000248 123456789 20111101.510.77432.20001C 2272014010 (company & Inv # from input 1) 510 77432201111010000 2 1 2INv 20111101.510.77432.20001D 2272014010 510 77432201111010000 2 1 3INv 20111101.510.77432.20002D 2272014010 510 77432201111010000 2 1 4INv 20111101.510.77432.20003D (company & Inv # from input 1) 510 77432201111010000 2 1 5INv 20111101.510.77432.20004D (company & Inv # from input 1) 510 77432201111010000 2 2 1ChK 200111000002 121000248 123456789 20111101.510.77432.20002C (company & Inv # from input 1) 510 77432201111010000 2 2 2INv 20111101.510.77432.20005D (company & Inv # from input 1) 510 77432201111010000 2 2 3INv 20111101.510.77432.20006D (company & Inv # from input 1) 510 77432201111010000 2 2 4INv 20111101.510.77432.20007D (company & Inv # from input 1) 510 77432201111010000 2 2 5INv 20111101.510.77432.20008D (company & Inv # from input 1) 510 77432201111010000 2 3 1ChK 300111000003 121000248 123456789 20111101.510.77432.20003C (company & Inv # from input 1) 510 77432201111010000 2 6 1ChK 600111000006 121000248 123456789 20111101.510.77432.20006C <there is no matching record in input 1,this will be blank> 510 77432201111010000 2 6 2INv 20111101.510.77432.20021D <there is no matching record in input 1,this will be blank> 510 77432201111010000 2 6 3INv 20111101.510.77432.20022D <there is no matching record in input 1,this will be blank> 510 77432201111010000 2 6 4INv 20111101.510.77432.20023D <there is no matching record in input 1,this will be blank> 510 77432201111010000 2 6 5INv 20111101.510.77432.20024D <there is no matching record in input 1,this will be blank> 解决方法
尝试这样的事情(未经测试):
awk ' NR==FNR && /Company Code/ { cc[$3,$4] = $NF; next; } NR==FNR && /Invoice Number/ { inv[$3,$4] = $NF; next; } NR==FNR {next} {print $0 FS cc[$3,$4] inv[$3,$4]}' input1 input2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容