Исправление инструкции awk

Это команда sed, которую вы ищете:

find /directory/. -type f -exec sed -i ':begin;$!N;s/\n/ /;tbegin' {} \;
0
12.05.2019, 14:07
2 ответа

(date "+%Y%m%d" -... d "$10")+0 в awk, когда переменные date и d не установлены, вычитает две строки +%Y%m%d, которая имеет числовое значение ноль, и (значение) поля 10, которое в этом случае может быть 20161499, получая значение -20161499. Я неправильно понял эту часть, а Гленн понял правильно, но в любом случае не выполняется дата как нужно.

Чтобы выполнить команду из awk и получить ее вывод, используйте форму pipe getline (см. информацию в вашей системе или в Интернете), но вы не можете полностью поместить ее в условие, поэтому сделайте ее частью вашего действия:

{ cmd = "date +%Y%m%d -d " $10; cmd | getline checktime; close (cmd);
  if( checktime != $10 ) { print "invalid time" $10; next } }

В качестве альтернативы, если у вас есть GNU awk (а если у вас есть GNU date, то, вероятно, есть), вы можете использовать встроенные функции mktime и strftime (которые действительно вписываются в умеренно сложное условие)

 strftime("%Y%m%d", mktime(substr($10,1,4)" "substr($10,5,2)" "substr($10,7,2)" 00 00 00")) == $10
2
28.01.2020, 02:15

Эта строка:

(date "+%Y%m%d" -d "$10")+0 != "$10"{print "Line:"NR" Field:10 "$10" is not in date format";next}

делает не вызов внешней команды date. awk разбирает это следующим образом:

  1. оператор - имеет больший приоритет, чем конкатенация строк, поэтому сначала мы берем строку "%Y%m%d" и вычитаем переменную d, получаем значение 0
  2. теперь берем значение переменной date (которая пуста) и конкатенируем 0 и строку "$10" (не значение 10-го поля)
  3. получается строка "0$10"
  4. затем прибавляем к этой строке ноль, получаем значение zero
  5. и сравниваем его со значением 10-го поля.

Это совпадет только в том случае, если в 10-м поле у вас 0.

GNU awk имеет некоторые функции времени, поэтому вы можете сделать что-то вроде (не проверено)

function validate_date(datestr,   timespec) {
    timespec = substr(datestr,1,4) " " substr(datestr,5,2) " " substr(datestr,7,2) " 0 0 0")
    return mktime(timespec)
}

{
    if (validate_date($10) == -1) {
        print $10 " is an invalid date"
    }
}
4
28.01.2020, 02:15

Теги

Похожие вопросы