我在从数据库导出的文本文件中有一个字段。该字段包含地址,但有时它们很长,数据库允许它们包含多行。导出时,换行符会被替换为这样的美元符号:
first part of very long address$second part of very long address$third part of very long address
并非每个地址都有多行,没有地址包含三行以上。每行的长度是可变的。
我正在按摩数据以导入MS Access,用于mailmerge。我想在$符号上分割字段,如果它在那里但是如果字段只包含1行,我想将我的两个额外输出字段设置为零长度字符串,这样我就不会在地址中出现空白行当它被打印出来时。
我有一个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
我只匹配没有HEADER的行。我需要在$符号上拆分文本字符串。管道之间的字符串不应该填充(这就是为什么我试图获取原始代码中的长度)。对于这个例子,有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|
希望有所帮助!如果这还不清楚,请告诉我。
答案 0 :(得分:0)
BEGIN { FS = "|" }
$1 != "HEADER" {
for(i = gsub(/\$/, "\t", $6); i < 3; i++)
$6 = $6 "\t"
print $6
}
我不确定我是否能满足你的要求。