AWK(意外的换行符或字符串结尾)

2 shell awk

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

数据

$ cat test.txt 
cat,command,for
cp,command,for
ls,command,to
Run Code Online (Sandbox Code Playgroud)

脚本

#!/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 }'
Run Code Online (Sandbox Code Playgroud)

输出

-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
Run Code Online (Sandbox Code Playgroud)

期望的输出

 1bcd1adf-2016-443b-9f00-2e4ce20726d7,8002,"TEST FILE","This is test",cat,command
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

She*_*ish 5

语法错误

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

awk -F ','  '{ print  '$TRN_GUID','$LCTN_ID','$LCTN_NAME','$LCTN_ADDR1',$1,$2 }'
Run Code Online (Sandbox Code Playgroud)

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

awk -F ','  '{ print "$TRN_GUID", "$LCTN_ID", "$LCTN_NAME", "$LCTN_ADDR1", $1, $2 }'
Run Code Online (Sandbox Code Playgroud)

您注意到语法突出显示的差异了吗?

不需要的输出

您无法访问变量,要实现此目的,您应该将它们作为变量传递。为此,我们只需使用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 }'
Run Code Online (Sandbox Code Playgroud)

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