【问题标题】:Unix field empty in the output query输出查询中的 Unix 字段为空
【发布时间】:2013-05-29 08:28:27
【问题描述】:

当我编写这段代码时:

ENDROW=""
while read ENDROW;
do
temp=${ENDROW##*#@;}          field1=`printf '"%s"\n' "${temp%%#@;*}"
#Here the insert >> ${sqlfile}

并查看${sqlfile} 输出,该字段为空...似乎在找到第一个分隔符然后不继续时,查找分隔符之间的字段的代码已完成。为什么?

【问题讨论】:

  • 我错过了done < name_of_file...您能否也显示您的一些输入以便我们检查?
  • 嗯,done < name_of_file 有.. 该文件的结构类似于#@;field1#@;field2#@;field3#@;field4#@;field5 所以我的代码会找到 field1 然后是 field2 等等。但结果是空的..跨度>
  • 除了没有关闭循环之外,还有一个以`printf 开头的半开命令替换,但从未关闭。请改进格式。

标签: unix find field ksh


【解决方案1】:

鉴于您在 cmets 中指出的输入:

$ cat file
#@
field1#@
field2#@
field3#@
field4#@
field5

这可以工作:

while read ENDROW
do
  echo ${ENDROW%*#@}
done < file

也就是说,您的替换必须使用%(从后面剥离...)而不是##(从前面剥离...)。

测试

$ while read ENDROW; do echo ${ENDROW%*#@}; done < file

field1
field2
field3
field4
field5

你的情况

#ENDROW="" #is not necessary
while read ENDROW;
do
  temp=${ENDROW%*#@}
  field1=$(printf '"%s"\n' "$temp")
#Here the insert >> ${sqlfile}

要了解有关 bash 替换的更多信息:
- wooledge.org - How can I use parameter expansion? How can I get substrings? How can I get a file without its extension, or get just a file's extension?
- Shell Command Language - 2.6.2 Parameter Expansion

【讨论】:

  • 所以...它会取代这种方法吗? temp=${ENDROW##*#@;}field1=printf '"%s"\n' "${temp%%#@;*}"`
  • 查看持续编辑的答案。我首先指出了这个替代应该如何完成,然后我更新了你的脚本。
  • 似乎进展顺利 :D 现在唯一的问题是日期的格式,因为输出是 printf: Error converting 02.10.00.000000 对日期字段的 '"%s"\n' 是否正确?
  • 我刚刚修正了field 行中的一个错字。检查是不是这个。否则,请提供真实数据以查看发生了什么。 %s = seconds since 1970-01-01 00:00:00 UTC,如果你给它一个真实的数据应该没问题。
  • mmh 现在字段的值是正确的,但它会打印带有分隔符的字段。"@#field1@#field2..不会是"field1 field2?
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 2018-09-30
  • 2010-10-23
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多