Разделение ввода Awk в Unix
Я пытаюсь написать программу Awk, которая берет две даты, разделенные, например, на 3/22/2013, и разбивает их на три отдельные числа, чтобы я мог работать с 3 22 и 2013 отдельно.
Я хотел бы, чтобы программа называлась как
awk -f program_file 2/23/2013 4/15/2013
пока что у меня есть:
BEGIN {
d1 = ARGV[1]
d2 = ARGV[2]
}
Это примет обе даты, но я не уверен, как их разбить. Кроме того, вышеуказанная программа должна вызываться с помощью nawk, а awk говорит, что она не может открыться 23.02.2013.
Заранее спасибо.
4 ответа
Вы не можете сделать это по-своему. поскольку 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/
не будет работать, если они (две даты) не в разных строках
Надеюсь, поможет
Вы можете решить использовать /
в качестве разделителя полей, и передать -F /
в GNU awk
(или для nawk
)
Как насчет этого?
[root@01 opt]# echo 2/23/2013 | awk -F[/] '{print $1}'
2
[root@01 opt]# echo 2/23/2013 | awk -F[/] '{print $2}'
23
[root@01 opt]# echo 2/23/2013 | awk -F[/] '{print $3}'
2013
Если вы работаете на машине с 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
Там могут быть лучшие подходы, хотя. Опубликуйте дополнительную информацию о том, что вы пытаетесь сделать, если вам нужна помощь.