проблема в использовании awk - PullRequest
0 голосов
/ 19 апреля 2011

Я не мог решить это. когда я выполняю эту программу, я получаю следующую ошибку "строка 7: неожиданный EOF при поиске соответствия` '' "

a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
var1=`echo $a | awk -F"U" '\
{
var2=`echo $var1 | awk -F"a"
{print " "$2}'`
}\
fi

Обновление: из другого, недавно закрытого вопроса

Если быть более точным, это мой код проекта

if [ "$FORMAT" = "java" ]; then
        cat $INPUT_FILE | awk -F":" '\
                /^$/ { print "" }\
                /^\/\/.*/ { print "     "$0}\
                /:string:/ { print "    public static final String "$1" = "$3";" }\
                /:char:/   { print "    public static final char "$1" = "$3";" }\

/:ullong:/ { print "    public static final long "$1" = "$3";" }\
                /:ulong:/  { print "    public static final int "$1" = "$3";" }\
                /:long:/   { print "    public static final int "$1" = "$3";" }\
        ' >> $CONST_FILE
fi;

Теперь мне нужно обрезать 3 доллара (это значение фактически читается из другого файла) на две части (только для улонга). скажем

$3=1256985361455ULL

мне нужно усечь в 1256985361455 и ULL. (только когда он длинный) пожалуйста, помогите мне в этом вопросе.

Я попытался использовать другой awk внутри следующего, но оказался в хаосе.

/:ullong:/ { print "    public static final long "$1" = "$3";" }\

Ответы [ 5 ]

2 голосов
/ 19 апреля 2011

Если вы ожидаете, что значение 3 для длинных записей будет примерно таким, как "1256985361455ULL", тогда

/:ullong:/ { 
    sub(/ULL$/, "", $3)
    print "    public static final long "$1" = "$3";" 
}
2 голосов
/ 19 апреля 2011

Ваша проблема с кавычками заключается в том, что после запуска команды с обратными кавычками она продолжается до следующей обратной кавычки. Это ваш код, как показано выше, за исключением того, что я удалил пустые строки.

a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
var1=`echo $a | awk -F"U" '\
{
var2=`echo $var1 | awk -F"a"
{print " "$2}'`
}\
fi

( Обратные кавычки '`' трудно отобразить в действующей уценке. )

В строке var1= начинается выражение с обратными кавычками, которое заканчивается следующей неэкранированной обратной кавычкой, следующей после var2=. Затем он читает остальную часть этой строки, а в следующей строке встречает одну кавычку. Когда он ищет следующую одинарную кавычку, ее нет - поэтому он сообщает об ошибке. Вы можете продемонстрировать, что это происходит поэтапно:

a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
var1=`echo $a | awk -F"U" '\
{
var2=\`echo $var1 | awk -F"a"
{print " "$2}'`
}\
fi

В приведенном выше сценарии есть экранирование (обратная косая черта) перед обратной кавычкой после var2=, поэтому теперь команда в обратных кавычках распространяется на обратную кавычку после строки print. Это все еще не допустимая оболочка; строка с }\ объединяется с fi для создания имени команды }fi, поэтому вы все равно получаете неожиданную ошибку EOF - потому что fi для конца if отсутствует. Снова измените скрипт:

a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
var1=`echo $a | awk -F"U" '\
{
var2=\`echo $var1 | awk -F"a"
{print " "$2}'`
#}\
fi

Это комментирует закрывающую фигурную скобку, и сценарий оболочки теперь 'valid'; настала очередь awk, чтобы начать жаловаться на неверный скрипт, который ему дан.

++ awk -FU '{
var2=`echo $var1 | awk -F"a"
{print " "$2}'
awk: syntax error at source line 2
 context is
     >>> var2=` <<< 
awk: illegal statement at source line 2
awk: illegal statement at source line 2
    missing }

Другие люди дали вам примерно то, что вам нужно в качестве ответа. Я бы, вероятно, использовал Perl для разделения (и я подозреваю, что я мог бы потерять промежуточный массив @x, если бы я потратил на него достаточно времени, производя сценарий строкового шума):

a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]
then var1=$(echo $a | perl -ne '@x=split /[aU]/; print "$x[1]\n"')
fi

Однако вы также можете сделать это в одной строке с awk, таким образом:

a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]
then var1=$(echo $a | awk -Fa '{sub("ULL","",$2); print $2}')
fi

Это разделяет ввод на «а» вместо «U»; затем он удаляет ULL из второго поля и печатает его. Если вы хотите разделить на 'U', то вы используете:

a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]
then var1=$(echo $a | awk -FU '{sub("[0-9]+a", "", $1); print $1}')
fi

Регулярное выражение в sub несколько сложнее.

1 голос
/ 19 апреля 2011

Не совсем точно, что вы пытаетесь сделать, но это небольшое переписывание распечатало среднюю часть (я думаю, что вы хотели)

> cat moo.sh
a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
        var1=`echo $a | awk -F"U" '{print $1}'`
        var2=`echo $var1 | awk -F"a" '{print " "$2}'`
        echo $var2
fi
> sh moo.sh
1504606846976
0 голосов
/ 19 апреля 2011
a=115292a1504606846976ULL
b=2

if [ "$b" = "2" ]; then
  var1=`echo $a | awk -F "U" '{print $1}' | awk -F "a" '{print $2}'`
fi
0 голосов
/ 19 апреля 2011

Вы не можете выполнять команды оболочки внутри awk, кроме как для системных вызовов. без того, чтобы вы сказали нам, чего вы пытаетесь достичь

#!/bin/bash
a=115292a1504606846976ULL
b=2
case "$b" in
 2 ) 
    a=${a%U*}
    echo ${a#*a} # I assume you want to get 1504606846976
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...