Это команда sed
, которую вы ищете:
find /directory/. -type f -exec sed -i ':begin;$!N;s/\n/ /;tbegin' {} \;
Я неправильно понял эту часть, а Гленн понял правильно, но в любом случае не выполняется (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
Эта строка:
(date "+%Y%m%d" -d "$10")+0 != "$10"{print "Line:"NR" Field:10 "$10" is not in date format";next}
делает не вызов внешней команды date
. awk разбирает это следующим образом:
-
имеет больший приоритет, чем конкатенация строк, поэтому сначала мы берем строку "%Y%m%d" и вычитаем переменную d
, получаем значение 0
date
(которая пуста) и конкатенируем 0 и строку "$10" (не значение 10-го поля)"0$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"
}
}