なぜこれがうまくいかないのですか?
$ echo "1" | awk '{ d=$(echo hi); print d }'
$ echo "1" | awk '{ print $(echo hi) }'
$ echo "1" | awk '{ d=$(date); print d }'
すべて「hi」/現在の日付の代わりに「1」を印刷します。
何が問題なの?
awkの外で実行すると正常に動作します。
$ d=$(echo hi); echo $d; -> prints "hi"
私の究極の目標は、次のことができることです。
$ cat dates | awk ' { d=$(date --date=$1 +"%s"); print d } '
日付のリストを見たいです。
2021-12-26T22:24:08+00:00
2021-12-26T22:24:18+00:00
2021-12-26T22:26:12+00:00
2021-12-26T22:28:07+00:00
そして、各日時のUnixタイムスタンプを表示します。
答え1
GNUを使用すると、date
次のように日付を含むファイルを直接読み取ることができます-f
。
$ cat file
2021-12-26T22:24:08+00:00
2021-12-26T22:24:18+00:00
2021-12-26T22:26:12+00:00
2021-12-26T22:28:07+00:00
$ date -f file +%s
1640557448
1640557458
1640557572
1640557687
$ date -f file +%s%t%c
1640557448 Sun Dec 26 23:24:08 2021
1640557458 Sun Dec 26 23:24:18 2021
1640557572 Sun Dec 26 23:26:12 2021
1640557687 Sun Dec 26 23:28:07 2021
awk は独自のプログラミング言語なので、awk
プログラムでシェル拡張を使用することはできません。$(...)
inの設定は、awk
シェルで行われているものとはかなり異なることを行います(アクセスするフィールドの数は角括弧内の式の結果であり、$(1+2)
これはinと同じです$3
。これはシェルの3番目のフィールド値です)。現在の記録)。
お持ちの場合本物これを行うには、入力ファイルの各行で各日付の一部を選択してから、その文字列を使用してUnixタイムスタンプを作成awk
できます。この機能は非標準ですが、一般的な実装でサポートされています(マニュアルを参照)。substr()
mktime()
mktime()
awk
awk
以下は、入力から読み取られたタイムスタンプをUTCタイムゾーンとして解釈します。
BEGIN { FS = "[-T+:]" }
{
ts = mktime(sprintf("%.4d %.2d %.2d %.2d %.2d %.2d",
$1, $2, $3, $4, $5, $6))
off = -60*(60*$7 + $8)
}
/-..:..$/ { off = -off }
{ print ts + off }
substr()
時間をコレクションの文字に分割するので、ここではそれを使用する必要はありません。-T+:
したがって、タイムスタンプの他の部分にフィールドとして直接アクセスできます。
$ TZ=UTC awk -f script file
1640553848
1640553858
1640553972
1640554087
答え2
@彼らの答えあなたの特定のニーズに合ったソリューションを提供するので、あなたは彼のソリューションを使用する必要があります。ただし、内部的にコマンドを実行しawk
て変数に保存する方法がわからない場合は、このgetline
関数を使用して実行できます。マニュアルページからawk(1)
:
command | getline [var]
Run command piping the output either into $0 or var,
as above.
最初の試みのいくつかの例は次のとおりです。
$ echo "1" | awk '{ "echo hi" |getline d; print d }'
hi
$ echo "1" | awk '{ "date" | getline d; print d }'
Mon Dec 27 02:47:29 PST 2021
date
内部で実行して意図した機能を取得する方法は次のとおりですawk
(やはり、実際にこのコマンドを使用しないでください。@彼らの答え、これは説明のためだけです):
$ cat dates | awk ' { "date --date="$1" +%s" |getline d; print d } '
1640557448
1640557458
1640557572
1640557687