【发布时间】:2015-03-09 21:05:43
【问题描述】:
我是一名 Java 开发人员,没有编写 shell 脚本的经验 我在 Shell 脚本中有这段代码,它基本上读取一个文件
if [ -f $DATA_FILE ] ; then
# Next - convert the data into insert statements
nawk -F\^ '
{
#I believe $115 is the 115th record in the data file in each lines
if ( $115 == "NULL" )
{
$115 = "";
}
output = "INSERT INTO DLRINFO";
output = output " (C_DCS_DLR_NBR,";
output = output " C_DLR_NBR,";
output = output " C_LOC_COMP,";
output = output " T_STAMP_CREATD,";
output = output " I_CREATOR)";
output = output " VALUES";
output = output " (ZZZ" $1 "ZZZ,";
output = output " ZZZ" $115 "ZZZ,";
output = output " ZZZ02ZZZ,";
output = output " current timestamp,";
output = output " ZZZC3RZZZ);";
print output
}' /tmp/$MY_NAME.1.out > /tmp/$MY_NAME.2.out
这实际上是逐行读取文件,其中的值由'^'分隔
现在文件格式正在发生变化,我需要使用位置对其进行分隔。
旧文件格式:
"70075"^"RIVERSIDE SUBARU"^"100 CHENALL RD"^"LIT RCK"^"AR"^"72223-5981"^"A"^"5019990000"^"5014999008"^"N/A"^""^"334"^"MBF - SOUTHERN"^"T1010DC"^"D CLAIRE"^"Y"^"OWNERS INSURANCE CO"^20150501^""^""^"THE WINROCK GROUP, INC."^""^"Y"^+100.^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^""^""^""^""^""^^"Unknown"^"00"^"Z -M"^"A"^"MARKET #999 SPECIAL ENTITIES"^"D CLAIRE-T1900DC"^"98102"^"02"
(这是数据文件的第一行。)
现在新的文件格式会是这样的
136324 70051 2015-02-01 36224 70900 1DR 136326 70023 2015-02-01 36326 70050 YY1WS 136328 70024 2015-02-01 36328 70061 YY1WS
(这是数据文件的第一行。) *每条记录的大小都是固定的,第一条记录是 5 个字符,第二条是 1 个字符,它们之间没有任何分隔符。
所需的输出: 我必须捕获前五个字符的记录,并从五个字符值的位置 30 开始记录。
谢谢。
【问题讨论】:
-
“使用位置分隔它”是什么意思?你的意思是每条记录都是固定大小的,它们之间没有任何分隔符?
-
“现在文件格式正在改变”您可能想要展示新文件格式的示例。
-
这将是文件的单行。 @jwodder 是的,每条记录都是固定大小的,第一条记录是 5 个字符,第二条是 1 个字符,它们之间没有任何分隔符
-
@JAVAUSER 将示例行放在可以使用 stackoverflow 格式化选项的全部功能的问题中,而不是在多个 cmets 上模棱两可地分布。不要让我们猜测“this”是什么意思。明确地拼出所有内容。就像您的代码使用
$115的一个示例一样,但您的 cmets 中的 nothing 表明我们会在您的新格式中找到它的位置。对于你给定的输入行,显示你想要的输出。 -
同意以上所有cmets。您可能需要知道的是
awk,就像java有一个子字符串函数一样。原型是substr("string", stPos, len)。如果您现在有一个固定长度的记录,请将您的$115引用更改为.... substr($0,300,3)之类的内容。 (从整行 ($0) 到位置 300,取 3 个字符)。祝你好运。