gpt4 book ai didi

shell - 在 unix 中的两个固定格式文件中查找字段值 - 不工作

转载 作者:行者123 更新时间:2023-12-04 15:58:11 24 4
gpt4 key购买 nike

我有 2 个固定长度的文件 input#1 和 input#2。我想根据两个文件中位置 37-50 的值匹配行(位置 37-50 在两个文件中将具有相同的值)。

如果找到任何匹配的记录,则根据公司代码和发票编号从输入文件 #1(位置 99 直到行尾)中删除值。

剪切字符串(来自输入 #1)需要附加在记录/行的末尾。

下面是我尝试过的代码(不工作)以及输入文件和所需的输出。请提供您的建议。

代码:

awk '
NR==FNR && NF>1 {
v=substr($0,37,14);
#print substr($0,37,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,37,14) in a) {
print $0 a[substr($0,99)]
}' Input1.txt input2.txt input3.txt

结束码

输入#1 开始 以一些空格开始
         612  1111111111201402120000       2     1  111  211 Due Date                             20140101                           
612 1111111111201402120000 2 1 111 311 Company Code 227
612 1111111111201402120000 2 1 111 411 Item Code 12
612 1111111111201402120000 2 1 111 511 Invoice Number 2014010
612 1111111111201402120000 2 2 111 611 Company Code 214
612 1111111111201402120000 2 2 111 711 Item Code 20
612 1111111111201402120000 2 2 111 811 Invoice Number 3014010
612 1111111111201402120000 2 3 111 911 Due Date 20140101
612 1111111111201402120000 2 3 111 111 Invoice Number 40140101
612 1111111111201402120000 2 3 111 121 user code 15563263636
612 1111111111201402120000 2 3 111 131 Amount Due 100000
612 111111111120140212000078978982123444 111 141 Due Date 20140101
612 111111111120140212000078978982123444 111 151 Invoice Number 50140101
612 111111111120140212000078978982123444 111 161 Amount Due 008000

输入 #1 结束

输入#2 开始
输入 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 && NF>1 {...;next}NR==FNR && ... --> next将阻止对除第一条记录之外的所有记录执行第二个操作。
  • NR==FNR && ( /Company Code/ OR /Invoice Number/ ) { --> OR不是有效的 awk语句,逻辑 OR 使用 || 完成(就像你使用 && 而不是 AND )。
  • print $0 a[substr($0,99)] --> a[substr($0,99)]从第二个输入文件中记录的第 99 个位置获取所有内容以在数组中查找,但您的 key 是 37-50。

  • 我们可以通过以下方式修复它们:
  • 摆脱next在第一个操作中,并将第三个操作限制为来自第二个输入文件的记录。
  • 替代 OR|| .
  • 使用 substr($0,37,14)作为在 a 中查找的关键和 substr(...,99)结果。

  • 这会产生以下代码(删除您的诊断 print 命令和未使用的第三个输入文件):
    awk '
    NR==FNR && NF>1 {
    v=substr($0,37,14);
    }
    NR==FNR && ( /Company Code/ || /Invoice Number/ ) {
    sub(/Company Code/,"",$0);
    sub(/Invoice Number/,"",$0);
    a[v]=$0;
    next
    }
    NR!=FNR && (substr($0,37,14) in a) {
    print $0 substr(a[substr($0,37,14)],99)
    }' input1.txt input2.txt

    由于您的输入已关闭,我无法重现您想要的输出,但我希望您能从这里开始弄清楚。

    此外,我将您的代码缩短为以下版本,按照我认为您希望它从给定的输入开始执行的操作:
    awk '
    {key=substr($0,37,14)}
    NR==FNR{
    if(/Company Code/||/Invoice Number/)array[key]=substr($0,98)
    next
    }
    (key in array){print $0,array[key]}
    ' input1.txt input2.txt

    如果您需要调整/解释,请随时发表评论。

    关于shell - 在 unix 中的两个固定格式文件中查找字段值 - 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029463/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com