2013-03-22 1 views
1

Я пытаюсь написать программу Awk, которая занимает две даты, разделенные/например, 3/22/2013, например, и разбивает их на три отдельных числа, так что я мог бы работать с 3 из 22 и 2013 отдельно.Разделительный вход Awk в Unix

Я хотел бы программу можно назвать как

awk -f program_file 2/23/2013 4/15/2013 

до сих пор у меня есть:

BEGIN { 
d1 = ARGV[1] 
d2 = ARGV[2] 
} 

Это будет принимать обе даты, но я не знаю, как разбить их. Кроме того, вышеуказанная программа должна быть вызвана с помощью nawk, а awk говорит, что не может открыть 2/23/2013.

Заранее спасибо.

ответ

0

Вы можете решить использовать / в качестве разделителя полей, и передать -F / в GNU awk (или nawk)

0

Как об этом?

[[email protected] opt]# echo 2/23/2013 | awk -F[/] '{print $1}' 
2 
[[email protected] opt]# echo 2/23/2013 | awk -F[/] '{print $2}' 
23 
[[email protected] opt]# echo 2/23/2013 | awk -F[/] '{print $3}' 
2013 
+0

Как это работает, когда даты считываются как 'awk -f prog_file 1/2/3 4/5/6' в командной строке? – user2177896

+0

что внутри prog_file? – Satish

+0

Нет комментариев для ответа на ваш awk, но я просто хочу напомнить, что лучше не выполнять эти тесты с помощью '# (root)', даже если вы на 200% уверены, что это безопасно. : D, игнорировать его, если это вам не подходит. Я извлек урок из него, поэтому, когда я увидел это, я напоминаю людям ... – Kent

2

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

две даты, хранятся в переменных оболочки, вы можете:

awk -vd1="$d1" -vd2="$d2" BEGIN{split(d1,one,"/");split(d2,two,"/");...}{...}' 

... часть вашей логике, в приведенном выше линии, расщепленные части хранятся в массиве one и two. например, вы хотите просто напечатать элементы из one:

kent$ d1=2/23/2013 
kent$ d2=4/15/2013 
kent$ awk -vd1="$d1" -vd2="$d2" 'BEGIN{split(d1,one,"/");split(d2,two,"/"); for(x in one)print one[x]}' 
2 
23 
2013 

или, как другие предложили, вы могли бы использовать FS из AWK, но вы должны сделать таким образом:

kent$ echo $d1|awk -F/ '{print $1,$2,$3}'   
2 23 2013 

если вы проходит два ВАРА в одном коротком, то -F/ не будет работать, если они (две дата) находятся в разных строках

надеются, что это помогает

0

Если вы находитесь на машине с nawk и awk, есть вероятность, что вы находитесь в Solaris и используете/bin/awk или/usr/bin/awk, оба из которых являются старыми, сломанными awk, которые никогда не должны использоваться. Вместо этого используйте/usr/xpg4/bin/awk на Solaris.

Во всяком случае, ваш вопрос:

$ cat program_file 
BEGIN { 
    d1 = ARGV[1] 
    d2 = ARGV[2] 

    split(d1,array,/\//) 
    print array[1] 
    print array[2] 
    print array[3] 

    exit 
} 

$ awk -f program_file 2/23/2013 4/15/2013 
2 
23 
2013 

Там может быть лучше всего подходит, хотя. Опубликуйте дополнительную информацию о том, что вы пытаетесь сделать, если хотите помочь.

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

  • Нет связанных вопросов^_^