Разделение ввода 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

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

Другие вопросы по тегам