【问题标题】:AWK (unexpected newline or end of string)AWK(意外的换行符或字符串结尾)
【发布时间】:2015-06-28 17:57:25
【问题描述】:

我正在尝试执行 bash 脚本,但我被卡住了。

数据

$ cat test.txt 
cat,command,for
cp,command,for
ls,command,to

脚本

#!/bin/bash    

CUT_FILE=test.txt
TRN_GUID="1bcd1adf-2016-443b-9f00-2e4ce20726d7"
LCTN_ID="8002"
LCTN_NAME="TEST FILE"
LCTN_ADDR1="This is test"

cat $CUT_FILE | awk -F ','  '{ print  '$TRN_GUID','$LCTN_ID','$LCTN_NAME','$LCTN_ADDR1',$1,$2 }'

输出

-bash-3.2# sh test4
awk: cmd. line:1: { print  1bcd1adf-2016-443b-9f00-2e4ce20726d7,8002,TEST
awk: cmd. line:1:                                                        ^ unexpected newline or end of string

期望的输出

 1bcd1adf-2016-443b-9f00-2e4ce20726d7,8002,"TEST FILE","This is test",cat,command

有什么想法吗?

【问题讨论】:

  • 学习在命令行中使用set -vx,然后检查以+ 开头的行。这些行是变量扩展为它们的值的地方。您应该看到(稍加思考),事情在哪里出了问题。祝你好运。

标签: shell awk


【解决方案1】:

语法错误

您正在使用单引号关闭脚本。

awk -F ','  '{ print  '$TRN_GUID','$LCTN_ID','$LCTN_NAME','$LCTN_ADDR1',$1,$2 }'

你能看到,使用语法突出显示,脚本在print ' 之后关闭了吗?您应该在脚本中使用双引号来防止这种情况,如下所示:

awk -F ','  '{ print "$TRN_GUID", "$LCTN_ID", "$LCTN_NAME", "$LCTN_ADDR1", $1, $2 }'

你注意到语法高亮的不同了吗?

不需要的输出

您无法访问 中的 变量,为此您应该将它们作为变量传递。为此,我们只需使用 awk 的 -v 选项。为了说明这一点:

awk -v trn_guid="$TRN_GUID" -v lctn_id="LCTN_ID" -v lctn_name="$LCTN_NAME" -v lctn_addr1="$LCTN_ADDR1" -v arg1="$1" -v arg2="$2" -F ','  '{ print trn_guid, lctn_id, lctn_name, lctn_addr1, arg1, arg2 }'

语法就是-v variable="value"。您可以在值中放入任何内容,包括 bash 变量。该变量将可以在 awk 脚本中使用您选择的名称进行访问。

【讨论】:

  • thnks shellFish@ 在遵循上述语法$TRN_GUID $LCTN_ID $LCTN_NAME $LCTN_ADDR1 cat command $TRN_GUID $LCTN_ID $LCTN_NAME $LCTN_ADDR1 cp command $TRN_GUID $LCTN_ID $LCTN_NAME $LCTN_ADDR1 ls command 后,我得到了以下输出
  • 您无法访问bash 中的awk 变量,您必须传递它们。我将更新答案以包含此内容。
  • thanks@anubhava 这个方法我已经试过了,当你处理大量文件时需要很长时间。请通过 awk 告诉我。
  • @akhileshchand 立即尝试。
【解决方案2】:

你不需要 awk 来做这个。只需在纯 BASH 中像这样使用它:

CUT_FILE="test.txt"
TRN_GUID="1bcd1adf-2016-443b-9f00-2e4ce20726d7"
LCTN_ID="8002"
LCTN_NAME="TEST FILE"
LCTN_ADDR1="This is test"

while read -r line; do
   echo "$TRN_GUID,$LCTN_ID,$LCTN_NAME,$LCTN_ADDR1,${line%,*}"
done < "$CUT_FILE"

输出:

1bcd1adf-2016-443b-9f00-2e4ce20726d7,8002,TEST FILE,This is test,cat,command
1bcd1adf-2016-443b-9f00-2e4ce20726d7,8002,TEST FILE,This is test,cp,command
1bcd1adf-2016-443b-9f00-2e4ce20726d7,8002,TEST FILE,This is test,ls,command

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多