タイムスタンプ(素人の観点から)は、ロケール文字列が追加されたISO8601文字列(通常はPOSIX指定形式の出力%FT%T
)です%Z
。%z
これにより、タイムスタンプ文字列は特定の「視点」になります。つまり、未定義の現地時間はありません(少なくとも24の異なる固有値を含む)。
これらの「特定時点」文字列は、+'%s'
情報を失うことなくエポック値(形式の結果)に変換できます。
たとえば、入力は列1と2にあり、出力は列3と4にあります。
$ cat indate
2020-03-02T12:23:34 UTC 1583151814 2020-03-02T06:23:34CST-0600
2020-03-02T12:23:34 Z 1583151814 2020-03-02T06:23:34CST-0600
2020-03-02T12:23:34 EST 1583169814 2020-03-02T11:23:34CST-0600
2020-03-02T12:23:34 CST 1583173414 2020-03-02T12:23:34CST-0600
2020-03-02T12:23:34 AST 1583166214 2020-03-02T10:23:34CST-0600
2020-03-02T12:23:34 ADT 1583162614 2020-03-02T09:23:34CST-0600
2020-03-02T12:23:34 EDT 1583166214 2020-03-02T10:23:34CST-0600
2020-03-02T12:23:34 BST 1583148214 2020-03-02T05:23:34CST-0600
2020-03-02T12:23:34 IST 1583132014 2020-03-02T00:53:34CST-0600
2020-03-02T12:23:34 +00:00 1583151814 2020-03-02T06:23:34CST-0600
2020-03-02T12:23:34 -0400 1583166214 2020-03-02T10:23:34CST-0600
2020-03-02T12:23:34 -0800 1583180614 2020-03-02T14:23:34CST-0600
2020-03-02T12:23:34 +06:00 1583130214 2020-03-02T00:23:34CST-0600
要求の出力は、タイムゾーンおよび(可能であれば)%Z%z
値で上書きされたタイムスタンプを考慮して、エポック以降の秒数でなければなりません。
私たち全員が知っているように、GNU dateは列1と2でこれらすべてを独自に処理できます。
$ date -f indate +%s
問題はawkの解決策ですか?
私がそれを得ることができる唯一の方法はAWKからこれは多くの再フォーマットを伴うGNU Dateを使用して行われ、新しい行ごとに外部実行可能ファイルを呼び出し、それをawkとして返します。私はdateを一度だけ呼び出す方法があると思いますが、それはまだ外部実行可能ファイルです。
もっと良い方法がありますか?awkを使う?
私が書いたawkスクリプトは次のとおりです。
$ cat tst.awk
#!/bin/bash
awk 'BEGIN{FS="[ \t:T-]*"}
{
cmd="date -d '\''"$1 $2"'\'' +'\''%s'\''";
while ( ( cmd | getline fmtDate) > 0 ) {
val = fmtDate
}
close(cmd);
datestr=$1" "$2" "$3" "$4" "$5" "$6" 0 "
print mktime(datestr),$1,$2,"\t",cmd,"\t",val
}' indate
そして出力は正しいようです(現地のEST時間に基づいて)。
$ ./tst.awk
1607012614 2020-12-03T12:23:34 UTC date -d '2020-12-03T12:23:34 UTC' +'%s' 1606998214
1607012614 2020-12-03T12:23:34 Z date -d '2020-12-03T12:23:34 Z' +'%s' 1606998214
1607012614 2020-12-03T12:23:34 EST date -d '2020-12-03T12:23:34 EST' +'%s' 1607016214
1607012614 2020-12-03T12:23:34 EDT date -d '2020-12-03T12:23:34 EDT' +'%s' 1607012614
1607012614 2020-12-03T12:23:34 BST date -d '2020-12-03T12:23:34 BST' +'%s' 1606994614
1607012614 2020-12-03T12:23:34 IST date -d '2020-12-03T12:23:34 IST' +'%s' 1606978414
1607012614 2020-12-03T12:23:34 +00:00 date -d '2020-12-03T12:23:34 +00:00' +'%s' 1606998214
1607012614 2020-12-03T12:23:34 -0400 date -d '2020-12-03T12:23:34 -0400' +'%s' 1607012614
1607012614 2020-12-03T12:23:34 -0800 date -d '2020-12-03T12:23:34 -0800' +'%s' 1607027014
1607012614 2020-12-03T12:23:34 +06:00 date -d '2020-12-03T12:23:34 +06:00' +'%s' 1606976614
答え1
以下は、ユーザーエクスペリエンスのタイムゾーンを理解していますが、データから直接理解できないGNU awkのさまざまな拡張についてすべてです。
正確に望む出力ではありません。 (すべてのTZ値、特にEDT、BST、ISTが移植可能か、awkのようにTZ形式で追加の処理が必要かわかりません。追加の調査が必要です。)影響を受けていることがわかります。
$ gawk '{
dt = gensub(/\s+\S+$/,"",1); gsub(/[-:T]/," ",dt)
tz = $NF
if ( match(tz,/^([-+]?)([0-9]{2}):?([0-9]{2})$/,a) ) {
tz = (a[1] == "-" ? "+" : "-") a[2] ":" a[3]
}
ENVIRON["TZ"] = tz
epochSecs = mktime(dt)
ENVIRON["TZ"] = "UTC"
printf "%-30s -> %10s -> %s UTC\n", $0, epochSecs, strftime("%F %T",epochSecs)
}' indate
2020-12-03T12:23:34 UTC -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 Z -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 EST -> 1607016214 -> 2020-12-03 17:23:34 UTC
2020-12-03T12:23:34 EDT -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 BST -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 IST -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 +00:00 -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 -0400 -> 1607012614 -> 2020-12-03 16:23:34 UTC
2020-12-03T12:23:34 -0800 -> 1607027014 -> 2020-12-03 20:23:34 UTC
2020-12-03T12:23:34 +06:00 -> 1606976614 -> 2020-12-03 06:23:34 UTC
上記は、環境変数の値を使用し、GNUが必要なスクリプトで実行されているawkスクリプトの環境で値を変更できることに依存しますmktime()
(タイムスタンプを簡単に比較するために派生したエポック秒からUTC時間を出力することです) )。 awkバージョン4.2以降の内部。strftime()
TZ
TZ
たとえば、入力の末尾に数字がある日付の場合、2020-12-03T12:23:34 +06:00
日付は+06:00
タイムゾーンではなく、UTCで提供されたタイムスタンプに適用される人が読み取ることができる増分として使用されます。date -d '2020-12-03T12:23:34 +06:00' +'%s'
(whichoutputs 1606976614
.whichは2020-12-03T12:23:34 UTC
-6時間)とTZ='+06:00' date -d '2020-12-03T12:23:34' +'%s'
(whichoutputs 1607019814
.whichは2020-12-03T12:23:34 UTC
+ 6時間)を使用すると、違いを確認できます。
したがって、上記のシンボルを実際のタイムゾーンで処理するのではなく、UTCで処理し、タイムスタンプに適用された増分で処理するのと同じ方法で処理するように変更tz
する必要があります。date
興味深いことに、タイムdate
ゾーンがタイムスタンプ文字列の一部として提供されておらず、TZに設定されている場合、EDT、BST、およびISTタイムゾーンの処理に関してgawkと同じように動作しますが、a:
の値がないと当然失敗します。 TZに設定されている場合は中央にあります。
$ while read -r ts tz; do
printf '%s:\t %s vs %s\n' "$tz" "$(date +'%s' -d"$ts $tz")" $(TZ="$tz" date '+%s' -d"$ts")
done < indate
UTC: 1606998214 vs 1606998214
Z: 1606998214 vs 1606998214
EST: 1607016214 vs 1607016214
EDT: 1607012614 vs 1606998214
BST: 1606994614 vs 1606998214
IST: 1606978414 vs 1606998214
+00:00: 1606998214 vs 1606998214
-0400: 1607012614 vs 1606998214
-0800: 1607027014 vs 1606998214
+06:00: 1606976614 vs 1607019814
date -d
したがって、タイムゾーンを読む以外に、いくつかの魔法が関係しているようです。マニュアルページasmostly free format human readable date string
などの文字列を含めることができますnext Thursday
。
もちろん、データに使用されている移植不可能なTZ値を移植可能な値にマッピングするために、このようなawkスクリプトを作成することもできます(参照)https://vdc-repo.vmware.com/vmwb-repository/dcr-public/790263bc-bd30-48f1-af12-ed36055d718b/e5f17bfc-ecba-40bf-a04f-376bbb118そしてhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones):
$ gawk 'BEGIN {
tzmap["EST"] = "US/Eastern"
tzmap["EDT"] = "-04:00"
tzmap["BST"] = "+01:00"
tzmap["IST"] = "Asia/Calcutta"
}
{
dt = gensub(/\s+\S+$/,"",1); gsub(/[-:T]/," ",dt)
tz = ( $NF in tzmap ? tzmap[$NF] : $NF )
if ( match(tz,/^([-+]?)([0-9]{2}):?([0-9]{2})$/,a) ) {
tz = (a[1] == "-" ? "+" : "-") a[2] ":" a[3]
}
ENVIRON["TZ"] = tz
epochSecs = mktime(dt)
ENVIRON["TZ"] = "UTC"
printf "%-30s -> %10s -> %s UTC\n", $0, epochSecs, strftime("%F %T",epochSecs)
}' indate
2020-12-03T12:23:34 UTC -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 Z -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 EST -> 1607016214 -> 2020-12-03 17:23:34 UTC
2020-12-03T12:23:34 EDT -> 1607012614 -> 2020-12-03 16:23:34 UTC
2020-12-03T12:23:34 BST -> 1606994614 -> 2020-12-03 11:23:34 UTC
2020-12-03T12:23:34 IST -> 1606978414 -> 2020-12-03 06:53:34 UTC
2020-12-03T12:23:34 +00:00 -> 1606998214 -> 2020-12-03 12:23:34 UTC
2020-12-03T12:23:34 -0400 -> 1607012614 -> 2020-12-03 16:23:34 UTC
2020-12-03T12:23:34 -0800 -> 1607027014 -> 2020-12-03 20:23:34 UTC
2020-12-03T12:23:34 +06:00 -> 1606976614 -> 2020-12-03 06:23:34 UTC
入力ファイルにどのTZが表示されるかを事前に知っておく必要があります。これはあなたに当てはまるようです。
注:上記のコマンドはMacで実行されます。 cygwinで同じコマンドを実行すると、TZ
値がわかりません。私はこれが他の種類の移植性の問題ではなく、cygwinの問題だと思います。date
awk
みんなと話し合った最後にタイムゾーンデータベースPaul Eggertが寄稿し、bashツールとPOSIXツールを使用して、タイムゾーンの略語からオフセット名とデータベース名までのマッピングファイルを生成するシェルスクリプトを作成しました(タイムゾーンデータベースディレクトリ構造と正しいツールバージョンがある場合)zdump
。
$ cat maptzabbrs
#!/usr/bin/env bash
usage() {
cat <<'!'
Usage: maptzabbrs [overrides]
maptzabbrs --help
Given a timezone database directory like /usr/share/zoneinfo/posix and
a version of zdump (https://man7.org/linux/man-pages/man8/zdump.8.html)
that supports "-i", this will output a tab-separated table of
Abbreviation -> Offset -> Database Names where the list of Database Names
associated with each Abbreviation+Offset will be comma-separated.
Database names without an alphanumeric abbreviation are ignored.
Input: "zdump -i" outputs blank line separated records like:
TZ="/usr/share/zoneinfo/posix/America/Chicago"
- - -06 CST
2022-03-13 03 -05 CDT 1
2022-11-06 01 -06 CST
TZ="/usr/share/zoneinfo/posix/Asia/Hong_Kong"
- - +08 HKT
Stdout Output (all alphanumeric abbreviations):
CDT -04:00 America/Havana,Cuba
CDT -05:00 America/Bahia_Banderas,America/Chicago,...
CST +08:00 Asia/Chongqing,Asia/Chungking,...
CST -05:00 America/Havana,Cuba
CST -06:00 America/Bahia_Banderas,...,America/Chicago,...
HKT +08:00 Asia/Hong_Kong,Hongkong
Stderr Output (only abbreviations with multiple offsets):
Warning: abbreviation(s) with multiple alternative offsets:
CDT -04:00 America/Havana,Cuba
CDT -05:00 America/Bahia_Banderas,America/Chicago,...
CST +08:00 Asia/Chongqing,Asia/Chungking,...
CST -05:00 America/Havana,Cuba
CST -06:00 America/Bahia_Banderas,...,America/Chicago,...
If this tool is called with an argument, that is taken as file of overrides
to disambiguate abbreviations such as the above that would otherwise have
multiple offsets, e.g. if the file "overrides" contained (third column
optional and ignored):
CDT -05:00 America/Bahia_Banderas,America/Chicago,...
CST -06:00 America/Bahia_Banderas,...,America/Chicago,...
Then calling the tool as
maptzabbrs overrides
would restrict the stdout for CST and CDT to only be for the stated
offsets and they would not be reported as ambiguous on stderr.
References:
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
https://en.wikipedia.org/wiki/Tz_database
Thanks to the TZ dabatase provider Paul Eggert for background
information and suggestions on how to make this work.
!
}
if [[ "$1" == "--help" ]]; then
usage
exit
fi
: tzDir=${tzDir:='/usr/share/zoneinfo/posix'}
(( $# > 0 )) && overrides=$1 || overrides='/dev/null'
ofs='\t'
printf "Zone${ofs}Offset${ofs}Names\n"
find "$tzDir" -type f | sort | xargs zdump -c 2022,2023 -i |
awk -v tzDir="$tzDir" -v OFS="$ofs" '
FILENAME == ARGV[1] {
abbr2offset[$1] = $2
next
}
NF {
if ( sub(/^TZ="/,"") ) {
sub(/".*/,"")
name = substr($0,length(tzDir)+2)
}
else {
# change [[:alpha:]] to [[a-zA-Z]] if not supported
abbr = ($4 ~ /[[:alpha:]]/ ? $4 : "")
offset = sprintf("%s:%02d",substr($3,1,3),substr($3,4))
if ( abbr != "" ) {
abbrs[abbr]
if ( !(abbr in abbr2offset) ||
((abbr in abbr2offset) && (abbr2offset[abbr] == offset)) ) {
if ( !seen_offset[abbr,offset]++ ) {
abbrsOffsets[abbr,++numOffsets[abbr]] = offset
}
if ( !seen_name[abbr,offset,name]++ ) {
abbrsNames[abbr,offset,++numNames[abbr,offset]] = name
}
}
}
}
}
END {
for ( abbr in abbrs ) {
for ( offsetNr=1; offsetNr<=numOffsets[abbr]; offsetNr++ ) {
offset = abbrsOffsets[abbr,offsetNr]
for ( nameNr=1; nameNr<=numNames[abbr,offset]; nameNr++ ) {
name = abbrsNames[abbr,offset,nameNr]
names = (nameNr>1 ? names "," : "") name
}
print abbr, offset, names | "sort"
if ( numOffsets[abbr] > 1 ) {
gotAmbiguous = 1
ambiguous[abbr OFS offset] = names
}
}
}
close("sort")
if ( gotAmbiguous ) {
print "Warning: abbreviation(s) with multiple alternative offsets:" | "cat>&2"
close("cat>&2")
for ( abbrOffset in ambiguous ) {
print abbrOffset, ambiguous[abbrOffset] | "sort>&2"
}
close("sort>&2")
}
}
' "$overrides" -
このオーバーレイファイルが与えられると、上記のコードを実行するのに約0.5秒かかります。
$ cat overrides
CDT -05:00 America/Bahia_Banderas,America/Chicago,America/Indiana/Knox,America/Indiana/Tell_City,America/Knox_IN,America/Matamoros,America/Menominee,America/Merida,America/Mexico_City,America/Monterrey,America/North_Dakota/Beulah,America/North_Dakota/Center,America/North_Dakota/New_Salem,America/Rainy_River,America/Rankin_Inlet,America/Resolute,America/Winnipeg,CST6CDT,Canada/Central,Mexico/General,US/Central,US/Indiana-Starke
CST -06:00 America/Bahia_Banderas,America/Belize,America/Chicago,America/Costa_Rica,America/El_Salvador,America/Guatemala,America/Indiana/Knox,America/Indiana/Tell_City,America/Knox_IN,America/Managua,America/Matamoros,America/Menominee,America/Merida,America/Mexico_City,America/Monterrey,America/North_Dakota/Beulah,America/North_Dakota/Center,America/North_Dakota/New_Salem,America/Rainy_River,America/Rankin_Inlet,America/Regina,America/Resolute,America/Swift_Current,America/Tegucigalpa,America/Winnipeg,CST6CDT,Canada/Central,Canada/Saskatchewan,Mexico/General,US/Central,US/Indiana-Starke
IST +05:30 Asia/Calcutta,Asia/Kolkata
PST -08:00 America/Ensenada,America/Los_Angeles,America/Santa_Isabel,America/Tijuana,America/Vancouver,Canada/Pacific,Mexico/BajaNorte,PST8PDT,US/Pacific
マイコンピュータでは、次の出力が生成されます。
$ /maptzabbrs overrides
Zone Offset Names
ACDT +10:30 Australia/Adelaide,Australia/Broken_Hill,Australia/South,Australia/Yancowinna
ACST +09:30 Australia/Adelaide,Australia/Broken_Hill,Australia/Darwin,Australia/North,Australia/South,Australia/Yancowinna
ADT -03:00 America/Glace_Bay,America/Goose_Bay,America/Halifax,America/Moncton,America/Thule,Atlantic/Bermuda,Canada/Atlantic
AEDT +11:00 Antarctica/Macquarie,Australia/ACT,Australia/Canberra,Australia/Currie,Australia/Hobart,Australia/Melbourne,Australia/NSW,Australia/Sydney,Australia/Tasmania,Australia/Victoria
AEST +10:00 Antarctica/Macquarie,Australia/ACT,Australia/Brisbane,Australia/Canberra,Australia/Currie,Australia/Hobart,Australia/Lindeman,Australia/Melbourne,Australia/NSW,Australia/Queensland,Australia/Sydney,Australia/Tasmania,Australia/Victoria
AKDT -08:00 America/Anchorage,America/Juneau,America/Metlakatla,America/Nome,America/Sitka,America/Yakutat,US/Alaska
AKST -09:00 America/Anchorage,America/Juneau,America/Metlakatla,America/Nome,America/Sitka,America/Yakutat,US/Alaska
AST -04:00 America/Anguilla,America/Antigua,America/Aruba,America/Barbados,America/Blanc-Sablon,America/Curacao,America/Dominica,America/Glace_Bay,America/Goose_Bay,America/Grenada,America/Guadeloupe,America/Halifax,America/Kralendijk,America/Lower_Princes,America/Marigot,America/Martinique,America/Moncton,America/Montserrat,America/Port_of_Spain,America/Puerto_Rico,America/Santo_Domingo,America/St_Barthelemy,America/St_Kitts,America/St_Lucia,America/St_Thomas,America/St_Vincent,America/Thule,America/Tortola,America/Virgin,Atlantic/Bermuda,Canada/Atlantic
AWST +08:00 Australia/Perth,Australia/West
BST +01:00 Europe/Belfast,Europe/Guernsey,Europe/Isle_of_Man,Europe/Jersey,Europe/London,GB,GB-Eire
CAT +02:00 Africa/Blantyre,Africa/Bujumbura,Africa/Gaborone,Africa/Harare,Africa/Juba,Africa/Khartoum,Africa/Kigali,Africa/Lubumbashi,Africa/Lusaka,Africa/Maputo,Africa/Windhoek
CDT -05:00 America/Bahia_Banderas,America/Chicago,America/Indiana/Knox,America/Indiana/Tell_City,America/Knox_IN,America/Matamoros,America/Menominee,America/Merida,America/Mexico_City,America/Monterrey,America/North_Dakota/Beulah,America/North_Dakota/Center,America/North_Dakota/New_Salem,America/Rainy_River,America/Rankin_Inlet,America/Resolute,America/Winnipeg,CST6CDT,Canada/Central,Mexico/General,US/Central,US/Indiana-Starke
CEST +02:00 Africa/Ceuta,Arctic/Longyearbyen,CET,Europe/Amsterdam,Europe/Andorra,Europe/Belgrade,Europe/Berlin,Europe/Bratislava,Europe/Brussels,Europe/Budapest,Europe/Busingen,Europe/Copenhagen,Europe/Gibraltar,Europe/Ljubljana,Europe/Luxembourg,Europe/Madrid,Europe/Malta,Europe/Monaco,Europe/Oslo,Europe/Paris,Europe/Podgorica,Europe/Prague,Europe/Rome,Europe/San_Marino,Europe/Sarajevo,Europe/Skopje,Europe/Stockholm,Europe/Tirane,Europe/Vaduz,Europe/Vatican,Europe/Vienna,Europe/Warsaw,Europe/Zagreb,Europe/Zurich,Poland
CET +01:00 Africa/Algiers,Africa/Ceuta,Africa/Tunis,Arctic/Longyearbyen,CET,Europe/Amsterdam,Europe/Andorra,Europe/Belgrade,Europe/Berlin,Europe/Bratislava,Europe/Brussels,Europe/Budapest,Europe/Busingen,Europe/Copenhagen,Europe/Gibraltar,Europe/Ljubljana,Europe/Luxembourg,Europe/Madrid,Europe/Malta,Europe/Monaco,Europe/Oslo,Europe/Paris,Europe/Podgorica,Europe/Prague,Europe/Rome,Europe/San_Marino,Europe/Sarajevo,Europe/Skopje,Europe/Stockholm,Europe/Tirane,Europe/Vaduz,Europe/Vatican,Europe/Vienna,Europe/Warsaw,Europe/Zagreb,Europe/Zurich,Poland
CST -06:00 America/Bahia_Banderas,America/Belize,America/Chicago,America/Costa_Rica,America/El_Salvador,America/Guatemala,America/Indiana/Knox,America/Indiana/Tell_City,America/Knox_IN,America/Managua,America/Matamoros,America/Menominee,America/Merida,America/Mexico_City,America/Monterrey,America/North_Dakota/Beulah,America/North_Dakota/Center,America/North_Dakota/New_Salem,America/Rainy_River,America/Rankin_Inlet,America/Regina,America/Resolute,America/Swift_Current,America/Tegucigalpa,America/Winnipeg,CST6CDT,Canada/Central,Canada/Saskatchewan,Mexico/General,US/Central,US/Indiana-Starke
ChST +10:00 Pacific/Guam,Pacific/Saipan
EAT +03:00 Africa/Addis_Ababa,Africa/Asmara,Africa/Asmera,Africa/Dar_es_Salaam,Africa/Djibouti,Africa/Kampala,Africa/Mogadishu,Africa/Nairobi,Indian/Antananarivo,Indian/Comoro,Indian/Mayotte
EDT -04:00 America/Detroit,America/Fort_Wayne,America/Grand_Turk,America/Indiana/Indianapolis,America/Indiana/Marengo,America/Indiana/Petersburg,America/Indiana/Vevay,America/Indiana/Vincennes,America/Indiana/Winamac,America/Indianapolis,America/Iqaluit,America/Kentucky/Louisville,America/Kentucky/Monticello,America/Louisville,America/Montreal,America/Nassau,America/New_York,America/Nipigon,America/Pangnirtung,America/Port-au-Prince,America/Thunder_Bay,America/Toronto,Canada/Eastern,EST5EDT,US/East-Indiana,US/Eastern,US/Michigan
EEST +03:00 Asia/Amman,Asia/Beirut,Asia/Damascus,Asia/Famagusta,Asia/Gaza,Asia/Hebron,Asia/Nicosia,EET,Europe/Athens,Europe/Bucharest,Europe/Chisinau,Europe/Helsinki,Europe/Kiev,Europe/Mariehamn,Europe/Nicosia,Europe/Riga,Europe/Sofia,Europe/Tallinn,Europe/Uzhgorod,Europe/Vilnius,Europe/Zaporozhye
EET +02:00 Africa/Cairo,Africa/Tripoli,Asia/Amman,Asia/Beirut,Asia/Damascus,Asia/Famagusta,Asia/Gaza,Asia/Hebron,Asia/Nicosia,EET,Egypt,Europe/Athens,Europe/Bucharest,Europe/Chisinau,Europe/Helsinki,Europe/Kaliningrad,Europe/Kiev,Europe/Mariehamn,Europe/Nicosia,Europe/Riga,Europe/Sofia,Europe/Tallinn,Europe/Uzhgorod,Europe/Vilnius,Europe/Zaporozhye,Libya
EST -05:00 America/Atikokan,America/Cancun,America/Cayman,America/Coral_Harbour,America/Detroit,America/Fort_Wayne,America/Grand_Turk,America/Indiana/Indianapolis,America/Indiana/Marengo,America/Indiana/Petersburg,America/Indiana/Vevay,America/Indiana/Vincennes,America/Indiana/Winamac,America/Indianapolis,America/Iqaluit,America/Jamaica,America/Kentucky/Louisville,America/Kentucky/Monticello,America/Louisville,America/Montreal,America/Nassau,America/New_York,America/Nipigon,America/Panama,America/Pangnirtung,America/Port-au-Prince,America/Thunder_Bay,America/Toronto,Canada/Eastern,EST,EST5EDT,Jamaica,US/East-Indiana,US/Eastern,US/Michigan
GMT +00:00 Africa/Abidjan,Africa/Accra,Africa/Bamako,Africa/Banjul,Africa/Bissau,Africa/Conakry,Africa/Dakar,Africa/Lome,Africa/Monrovia,Africa/Nouakchott,Africa/Ouagadougou,Africa/Sao_Tome,Africa/Timbuktu,America/Danmarkshavn,Atlantic/Reykjavik,Atlantic/St_Helena,Eire,Etc/GMT,Etc/GMT+0,Etc/GMT-0,Etc/GMT0,Etc/Greenwich,Europe/Belfast,Europe/Dublin,Europe/Guernsey,Europe/Isle_of_Man,Europe/Jersey,Europe/London,GB,GB-Eire,GMT,GMT+0,GMT-0,GMT0,Greenwich,Iceland
HDT -09:00 America/Adak,America/Atka,US/Aleutian
HKT +08:00 Asia/Hong_Kong,Hongkong
HST -10:00 America/Adak,America/Atka,HST,Pacific/Honolulu,Pacific/Johnston,US/Aleutian,US/Hawaii
IDT +03:00 Asia/Jerusalem,Asia/Tel_Aviv,Israel
IST +05:30 Asia/Calcutta,Asia/Kolkata
JST +09:00 Asia/Tokyo,Japan
KST +09:00 Asia/Pyongyang,Asia/Seoul,ROK
MDT -06:00 America/Boise,America/Cambridge_Bay,America/Chihuahua,America/Denver,America/Edmonton,America/Inuvik,America/Mazatlan,America/Ojinaga,America/Shiprock,America/Yellowknife,Canada/Mountain,MST7MDT,Mexico/BajaSur,Navajo,US/Mountain
MEST +02:00 MET
MET +01:00 MET
MSK +03:00 Europe/Moscow,Europe/Simferopol,Europe/Tiraspol,W-SU
MST -07:00 America/Boise,America/Cambridge_Bay,America/Chihuahua,America/Creston,America/Dawson,America/Dawson_Creek,America/Denver,America/Edmonton,America/Fort_Nelson,America/Hermosillo,America/Inuvik,America/Mazatlan,America/Ojinaga,America/Phoenix,America/Shiprock,America/Whitehorse,America/Yellowknife,Canada/Mountain,Canada/Yukon,MST,MST7MDT,Mexico/BajaSur,Navajo,US/Arizona,US/Mountain
NDT -02:30 America/St_Johns,Canada/Newfoundland
NST -03:30 America/St_Johns,Canada/Newfoundland
NZDT +13:00 Antarctica/McMurdo,Antarctica/South_Pole,NZ,Pacific/Auckland
NZST +12:00 Antarctica/McMurdo,Antarctica/South_Pole,NZ,Pacific/Auckland
PDT -07:00 America/Ensenada,America/Los_Angeles,America/Santa_Isabel,America/Tijuana,America/Vancouver,Canada/Pacific,Mexico/BajaNorte,PST8PDT,US/Pacific
PKT +05:00 Asia/Karachi
PST -08:00 America/Ensenada,America/Los_Angeles,America/Santa_Isabel,America/Tijuana,America/Vancouver,Canada/Pacific,Mexico/BajaNorte,PST8PDT,US/Pacific
SAST +02:00 Africa/Johannesburg,Africa/Maseru,Africa/Mbabane
SST -11:00 Pacific/Pago_Pago,Pacific/Samoa,US/Samoa
UTC +00:00 Etc/UCT,Etc/UTC,Etc/Universal,Etc/Zulu,UCT,UTC,Universal,Zulu
WAT +01:00 Africa/Bangui,Africa/Brazzaville,Africa/Douala,Africa/Kinshasa,Africa/Lagos,Africa/Libreville,Africa/Luanda,Africa/Malabo,Africa/Ndjamena,Africa/Niamey,Africa/Porto-Novo
WEST +01:00 Atlantic/Canary,Atlantic/Faeroe,Atlantic/Faroe,Atlantic/Madeira,Europe/Lisbon,Portugal,WET
WET +00:00 Atlantic/Canary,Atlantic/Faeroe,Atlantic/Faroe,Atlantic/Madeira,Europe/Lisbon,Portugal,WET
WIB +07:00 Asia/Jakarta,Asia/Pontianak
WIT +09:00 Asia/Jayapura
WITA +08:00 Asia/Makassar,Asia/Ujung_Pandang
tzmap[]
上記のawkスクリプトで使用した配列を手動で埋めるのではなく、これらのマッピングを埋める必要があるawkスクリプトからツールの出力を読み取ることができます。
答え2
私がこれを達成できる唯一の方法は、GNU日付を使用することです。これには多くの再フォーマットが必要であり、新しい行ごとに外部実行可能ファイルを呼び出してそれをawkとして返すことです。
GNU日付はファイルから日付を読み取ることができます。
% cat foo.dates
2020-12-03T12:23:34 UTC
2020-12-03T12:23:34 Z
2020-12-03T12:23:34 EST
2020-12-03T12:23:34 EDT
2020-12-03T12:23:34 BST
2020-12-03T12:23:34 IST
2020-12-03T12:23:34 +00:00
2020-12-03T12:23:34 -0400
2020-12-03T12:23:34 -0800
2020-12-03T12:23:34 +06:00
% date --file foo.dates +%s
1606998214
1606998214
1607016214
1607012614
1606994614
1606978414
1606998214
1607012614
1607027014
1606976614
そうでなくても、これはxargs
awkの仕事ではなく仕事のようです。
% xargs < foo.dates -n 1 -d '\n' date +%s -d
1606998214
1606998214
1607016214
1607012614
1606994614
1606978414
1606998214
1607012614
1607027014
1606976614