【问题标题】:AWK print unexpected newline or end of string inside shellAWK 在 shell 内打印意外的换行符或字符串结尾
【发布时间】:2020-12-29 18:30:03
【问题描述】:

我有一个 shell 脚本,它试图从行尾修剪一个文件,但我总是遇到一些错误。

Shell 脚本:

AWK_EXPRESSION='{if(length>'"$RANGE1"'){ print substr('"$0 "',0, length-'"$RANGE2"'}) } else { print '"$0 "'} }'

for report in ${ACTUAL_TARGET_FOLDER}/* ; do
  awk $AWK_EXPRESSION $report > $target_file
done

如果我触发 AWK 命令,我会在打印附近得到unexpected newline or end of string

我错过了什么?

【问题讨论】:

标签: unix awk


【解决方案1】:

您为什么要将 awk 主体存储在 shell 变量中?只需使用 awk 和 -v 选项将 shell 值传递给 awk 变量:

awk -v range1="$RANGE1" -v range2="$RANGE2" '{
    if (length > range1) {
        print substr($0,0, length-range2)
    } else { 
        print 
    }
}' "$ACTUAL_TARGET_FOLDER"/* > "$target_file"

添加一些换行符以提高可读性。

改掉使用 ALLCAPS 变量名的习惯,让 shell 保留这些变量名。有一天你会写PATH=something,然后写wonder why your script is broken

未加引号的变量服从word splittingglob 扩展。对所有变量使用双引号,除非您知道要使用什么特定的副作用。

【讨论】:

  • 感谢@glenn 使用了 Joni 的建议,您的见解也有所帮助...谢谢!
【解决方案2】:

我建议使用 AWK 变量编写 AWK 程序,而不是从 shell 中将变量插入其中。您可以在命令行中使用-v 命令行选项将变量传递给awk。

此外,awk 允许使用空格来使程序可读,就像其他编程语言一样。像这样:

AWK_EXPRESSION='{
  if (length > RANGE1) {
    print substr($0, 1, length-RANGE2)
  } else {
    print
  }
}'

for report in "${ACTUAL_TARGET_FOLDER}"/* ; do
  awk -v RANGE1="$RANGE1" -v RANGE2="$RANGE2" "$AWK_EXPRESSION" "$report" > "$target_file"
done

【讨论】:

  • 感谢@joni,这对我有帮助并为我工作......今天我整天都为此感到头疼。
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 2020-11-18
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
相关资源
最近更新 更多