왜 이 모든 것이 작동하지 않습니까?
$ 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
그리고 각 날짜 시간의 유닉스 타임스탬프를 표시합니다.
답변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
. 이는 셸의 세 번째 필드 값입니다). 현재 기록) .
당신이 가지고 있다면진짜이를 위해 입력 파일의 각 줄에서 각 날짜의 일부를 선택한 다음 해당 문자열을 사용하여 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