1

/ で区切られた 2 つの日付を取得する Awk プログラムを作成しようとしています。たとえば、2013 年 3 月 22 日であり、それらを 3 つの別々の数字に分割して、22 の 3 と 2013 を別々に操作できるようにします。

プログラムを次のように呼び出したい

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

これまでのところ、私は持っています:

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

これは両方の日付を受け入れますが、それらを分割する方法がわかりません。さらに、上記のプログラムは nawk で呼び出す必要があり、awk は 2013 年 2 月 23 日を開くことができないと言います。

前もって感謝します。

4

4 に答える 4

2

あなたのやり方ではできません。awk は、入力として 2 つのファイルがあると見なすためです。つまり、日付文字列がファイル名のように見えました。そのため、そのエラー メッセージが表示されます。

2 つの日付がシェル変数に格納されている場合、次のことができます。

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

...部分はロジックです。上記の行では、分割された部分が配列 and に格納されてonetwoます。たとえば、次の要素を印刷したいだけです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

2 つの変数を 1 つの short で渡すと、-F/それら (2 つの日付) が異なる行にない限り、機能しません。

それが役に立てば幸い

于 2013-03-22T13:52:35.787 に答える
0

/フィールド区切りとして使用することを決定し-F /、GNU awk(またはnawk)に渡すことができます。

于 2013-03-22T13:43:43.857 に答える
0

どうですか?

[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
于 2013-03-22T13:46:32.583 に答える
0

nawk と awk を備えたマシンを使用している場合、Solaris 上で /bin/awk または /usr/bin/awk を使用している可能性があります。どちらも古い壊れた awk であるため、使用してはなりません。代わりに、Solaris では /usr/xpg4/bin/awk を使用してください。

とにかく、あなたの質問に:

$ 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

ただし、より良いアプローチがあるかもしれません。助けが必要な場合は、何をしようとしているのかについての詳細情報を投稿してください。

于 2013-03-23T02:45:16.407 に答える