Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字段中元素的有效拆分_String_Gawk - Fatal编程技术网

String 字段中元素的有效拆分

String 字段中元素的有效拆分,string,gawk,String,Gawk,我在从数据库导出的文本文件中有一个字段。该字段包含地址,但有时它们很长,数据库允许它们包含多行。导出时,换行符将替换为美元符号,如下所示: first part of very long address$second part of very long address$third part of very long address 并非每个地址都有多行,也没有地址包含的行数超过三行。每行的长度是可变的 我正在处理数据,以便导入到MS Access,用于邮件合并。我想拆分$sign上的字段,如果

我在从数据库导出的文本文件中有一个字段。该字段包含地址,但有时它们很长,数据库允许它们包含多行。导出时,换行符将替换为美元符号,如下所示:

first part of very long address$second part of very long address$third part of very long address
并非每个地址都有多行,也没有地址包含的行数超过三行。每行的长度是可变的

我正在处理数据,以便导入到MS Access,用于邮件合并。我想拆分$sign上的字段,如果它在那里,但如果字段只包含一行,我想将我的两个额外输出字段设置为零长度字符串,这样在打印地址时就不会出现空行

我有一个awk文件,它可以正确处理文本文件中的所有其他数据,但我需要让最后一位正常工作。我尝试了下面的代码。除了在else中出现语法错误之外,我不确定这是否是一种实现我所希望的功能的好方法。这是通过Windows上的gawk完成的

BEGIN { FS = "|" }
$1 != "HEADER" {
    if ($6 ~ /\$/)
        split($6, arr, "$")
        address = arr[1]
        addresstwo = arr[2]
        addressthree = arr[3]
        addressLength = length(address)
        addressTwoLength = length(addresstwo)
        addressThreeLength = length(addressthree)

    else {
        address = $6
        addressLength = length($6)
        addresstwo = ""
        addressTwoLength = length(addresstwo)
    addressthree = ""
        addressThreeLength = length(addressthree)
        }

    printf("%*s\t%*s\t\%*s\n",
          addressLength, address, addressTwoLength, addresstwo, addressThreeLength, addressthree)
}
编辑: 很抱歉。这是一个样品

HEADER|0000000130|0000527350|0000171250|0000058000|0000756600|0000814753|0000819455|100106
rec1|ILL/COLORADO COLLEGE$TUTT LIBRARY|1021 N CASCADE$COLORADO SPRINGS, CO 80903|
rec2|ILL /PIKES PEAK LIBRARY DISTRICT|20 N. CASCADE AVE. / PO BOX 1579$COLORADO SPRINGS, CO 80903|
rec3|DOE,JOHN|PO Box 8034|
rec4|ILL/GEORGIA INSTITUTE OF TECHNOLOGY|INFORMATION DELIVERY DEPT$704 CHERRY ST$ATLANTA, GA 30332-0900
我只匹配其中没有标题的行。我需要拆分$signs上的文本字符串。管道之间的字符串不应填充,这就是为什么我试图在原始代码中获得长度。对于这个例子,有6个输出字段,任何没有数据的字段都只是一个空字符串,这也是我在代码中试图做的

rec1|ILL/COLORADO COLLEGE|TUTT LIBRARY|1021 N CASCADE|COLORADO SPRINGS, CO 80903||
rec2|ILL /PIKES PEAK LIBRARY DISTRICT||20 N. CASCADE AVE. / PO BOX 1579|COLORADO SPRINGS, CO 80903||
rec3|DOE,JOHN||PO Box 8034|||
rec4|ILL/GEORGIA INSTITUTE OF TECHNOLOGY||INFORMATION DELIVERY DEPT|704 CHERRY ST|ATLANTA, GA 30332-0900|
希望有帮助!如果还不清楚,请告诉我

BEGIN { FS = "|" }
$1 != "HEADER" {
    for(i = gsub(/\$/, "\t", $6); i < 3; i++)
        $6 = $6 "\t"
    print $6
}

不过,我不确定我是否正确理解了您的要求。

最好先给出一个输入数据的清晰示例,然后再给出所需的输出。