2014-10-30 4 views
1

У меня есть файл и поле является меткой времени, как 20141028 20:49:49, я хочу, чтобы получить час 20, поэтому я использую system команду:как получить вывод команды «системы» в AWK

hour=system("date -d\""$5"\" +'%H'") 

штамп времени является пятым полем в моем файле, поэтому я использовал $5. Но когда я выполнил программу, я нашел команду выше, просто вывел 20 и вернул 0 так hour is 0 but not 20, так что мой вопрос в том, как получить час в штампе времени?

Я знаю, что метод, который использует split функцию два раза, как это:

split($5, vec, " ") 
split(vec[2], vec2, ":") 

Но этот метод немного неэффективный и некрасиво.

так что есть ли другие решения? Спасибо

+0

Возможный дубликат [позвонить ей ll изнутри awk и передать некоторые awk-переменные команде оболочки] (http://stackoverflow.com/questions/20646819/call-a-shell-command-from-inside-awk-and-pass-some-awk- variables-to-the-shell-co) –

+0

В частности, [этот ответ] (https://stackoverflow.com/questions/20646819/call-a-shell-command-from-inside-awk-and-pass-some- AWK-переменные-к-оболочки со/20648953 # 20648953). –

+1

@ nu11p01n73R моя ошибка, уже исправлено Спасибо – ningyuwhut

ответ

2

Вы можете использовать функцию substr для извлечения часа без использования команды system.

, например:

awk {'print substr("20:49:49",1,2)}' 

будет производить выход как

20 

Или более конкретно, как и в вопросе

$ awk {'print substr("20141028 20:49:49",10,2)}' 
20 

substr(str, pos, len) извлекает подстроку из str в положении pos и длина len

если значение $5 является 20141028 20:49:49,

$ awk {'print substr($5,10,2)}' 
20 
2

Другой способ использования gawk:

gawk 'match($5, " ([0-9]+):", r){print r[1]}' input_file 

Если вы хотите знать, как управлять externall выход процесса в awk:

awk '{cmd="date -d \""$5"\" +%H";cmd|getline hour;print hour;close(cmd)}' input_file 
+0

+1: Хотя ответ« использовать getline », вероятно, должен быть более явным. –

+0

Спасибо, но когда я выполняю эту команду, я получил ошибку 'usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v [+ | -] val [ymwdHMS]]. .. [-f fmt date | [[[mm] dd] HH] MM [[cc] yy] [.ss]] [+ format] ' – ningyuwhut

+0

Да, вы правы, я сменил машину и получил ответ! но можете ли вы объяснить дату 'cmd = '-d \" "$ 5" \ "+% H" ', для чего нужна обратная косая черта? благодаря – ningyuwhut

Смежные вопросы