Заменить строку в зависимости от содержимого файла - PullRequest
0 голосов
/ 23 октября 2018

У меня есть файл, который содержит метку времени и дату во втором столбце.Если строка содержит одно слово, то его необходимо заменить, как показано ниже.Любая помощь приветствуется.

File:
a smallint
b timestamp
c date
d varchar

O/P:
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar

Если я добавлю awk в отдельном операторе, то он будет работать, но если я добавлю оператор if else, я получу ошибку.

awk '{if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD)" }' test.out 

Error:
awk: {if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD HH:NN:SS.sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD)" }
awk: ^ syntax error
awk: {if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD HH:NN:SS.sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD)" }
awk: ^ syntax error

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Когда вы попытаетесь сделать отступ в своем коде (в awk вы можете использовать символы новой строки между одинарными кавычками), вы увидите, что у вас есть print перед else.

   awk '{
      if ($2=="timestamp") {
         $3="dataformat(";
      };
      print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
      else
      ($2=="date") {
         $3="dataformat(";
      };
      print $3 $1 ",'\''YYYY-MM-DD)"
   }' test.out

Этот код можно «исправить» с помощью

   awk '{
      if ($2=="timestamp") {
         $3="dataformat(";
         print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
      }
      if ($2=="date") {
         $3="dataformat(";
         print $3 $1 ",'\''YYYY-MM-DD)"
      }
   }' test.out

Вы видите, что вам не нужно выражение else.Теперь появляются новые проблемы.Вы не должны использовать $3 для переменной, просто создайте новую.
Переменные можно установить в качестве параметра awk, в разделе BEGIN {} или в обычном потоке.
Я бы использовал параметрыдля переменных с одинарной кавычкой.Я также представил startvar и othervar, просто чтобы показать, как они работают.

   awk -v ymd="'YYYY-MM-DD'" \
       -v dt="'YYYY-MM-DD HH:NN:SS.sss'" \
     '
        BEGIN {
           startvar="Example variable"
        }
        $2=="timestamp" {
            printf("%s, dateformat(%s)\n", $1, ymd);
            othervar=startvar" expanded";
            print othervar;
        }
        $2=="date" {
           printf("%s, dateformat(%s)\n", $1, dt);
        }
      ' test.out

Без демонстрационной части с дополнительными переменными и удалением некоторых строк новой строки вы получите

   awk -v ymd="'YYYY-MM-DD'" -v dt="'YYYY-MM-DD HH:NN:SS.sss'" '
        $2=="timestamp" { printf("%s, dateformat(%s)\n", $1, ymd); }
        $2=="date" { printf("%s, dateformat(%s)\n", $1, dt); }
     ' test.out
0 голосов
/ 23 октября 2018
$ cat tst.awk
BEGIN {
    fmt["timestamp"] = "dateformat(%s,\047YYYY-MM-DD HH:NN:SS.sss\047)"
    fmt["date"]      = "dateformat(%s.\047YYYY-MM-DD\047)"
}
$2 in fmt { $0 = sprintf(fmt[$2],$1) }
{ print }

$ awk -f tst.awk file
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar

Поскольку скрипт находится в файле, я мог бы использовать буквальные ' s, но вместо этого я использовал \047 s, чтобы вы могли использовать его как awk 'script' file вместо этого, если хотите.

0 голосов
/ 23 октября 2018

Если вы хотите использовать одинарные или двойные кавычки в awk, используйте восьмеричную запись.\ 047 - одинарные кавычки.Смотри ниже

> cat datatype.txt
a smallint
b timestamp
c date
d varchar
> awk -F" " ' { if($2~/date/) { print "dateformat("$1".\047YYYY-MM-DD\047)" } } ' datatype.txt
dateformat(c.'YYYY-MM-DD')
> awk -F" " ' { if($2~/timestamp/) { print "dateformat("$1",\047YYYY-MM-DD HH:NN:SS.sss\047)" } } ' datatype.txt
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
>
...