【问题标题】:Unix Shell Scripting - How to read values from a file line by line with position delimeterUnix Shell 脚本 - 如何使用位置分隔符逐行读取文件中的值
【发布时间】: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 个字符)。祝你好运。

标签: shell unix


【解决方案1】:

谢谢@shelter

你可能只需要知道 awk,就像 java 有一个 substring 函数一样。原型是 substr("string", stPos, len)。如果你现在 有一个固定长度的记录,您将 $115 的引用更改为 类似于 .... substr($0,300,3)。 (从整行 ($0),转到 位置 300,取 3 个字符)。

这就是我要找的。 substr("string", stPos, len) 就是我所需要的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多