2015-06-28 6 views
0

Я пытаюсь выполнить скрипт bash, но я застрял.AWK (неожиданная новая строка или конец строки)

данные

$ 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 

Любые идеи?

+0

научиться использовать 'набор -vx' из командной строки, а затем изучить линии предшествовавшие с' + '. Эти строки содержат переменные, которые расширяются до значений. Вы должны видеть (с небольшой мыслью), где вещи ломаются. Удачи. – shellter

ответ

2

Ошибка синтаксиса

Вы закрываете свой скрипт, используя одинарные кавычки.

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-скрипте, используя имя, которое вы выбрали.

+0

Thnks Моллюски @ я получил ниже выхода после следовать выше синтаксиса команды '$ TRN_GUID $ LCTN_ID $ LCTN_NAME $ LCTN_ADDR1 кошка $ TRN_GUID $ LCTN_ID $ LCTN_NAME $ LCTN_ADDR1 командного ф $ TRN_GUID $ LCTN_ID $ LCTN_NAME $ LCTN_ADDR1 Ls command' –

+0

Вы не можете доступа [tag: bash] внутри [tag: awk], вам нужно будет передать их. Я обновлю ответ, чтобы включить это. – ShellFish

+0

спасибо @ anubhava этот метод, который я уже пробовал и занимает столько времени, когда u hv большой объем файлов. Пожалуйста, дайте мне знать через awk. –

0

Для этого вам не нужен 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