user4993731
user4993731

Reputation:

AWK (unexpected newline or end of string)

I'm trying to execute bash script but I'm got stuck.

data

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

script

#!/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 }'

output

-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

desired output

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

Any ideas?

Upvotes: 2

Views: 18799

Answers (2)

ShellFish
ShellFish

Reputation: 4551

Syntax Error

You are closing your script using the single quotes.

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

Can you see, using the syntax highlighting, that the script gets closed after print '? You should use double quotation marks inside your script to prevent this, like so:

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

Do you notice the difference in syntax highlighting?

Undesired output

You cannot access variables inside , to accomplish this you should pass them as variables. To do that, we simply use the -v option of awk. To illustrate this point:

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 }'

The syntax is simply -v variable="value". You can put anything in the value, including bash variables. The variable will be accessible in the awk script using the name you chose.

Upvotes: 6

anubhava
anubhava

Reputation: 784958

You don't need awk for this. Just use it like this in pure 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"

Output:

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

Upvotes: 1

Related Questions