パイプで区切られたファイルの日付フィールドの書式設定

パイプで区切られたファイルの日付フィールドの書式設定

助けが必要です。次の形式のパイプで区切られたファイルがあります。

Location|1111|222222|333333|Doe|John|19900723|19900724|19900725

最後の3つのフィールドは日付フィールドですが、フォーマットできないようです。次のようにフォーマットする必要があります。1990/07/23。私はawkを学んでいるので、awkを介して行うことを好むが、提案に開いている。

答え1

Kusalanandaが述べたように、いくつかの文字列操作を実行できます。

awk -F'|' -v OFS='|' '
    function format_date(d) { return substr(d,1,4) "/" substr(d,5,2) "/" substr(d,7) }
    { for (i = 7; i <= 9; i++) $i = format_date($i); print }
' file

答え2

awk -F'|' 'BEGIN {OFS="|"} {print $1,$2,$3,$4,$5,$6,strftime("%Y/%m/%d",$7),strftime("%Y/%m/%d",$8),strftime("%Y/%m/%d",$9)}' inputfile

ここで重要なのは、strftime()最初のパラメーターの書式文字列を使用して、2番目のパラメーターに指定された日付の書式を指定することです。

$ echo "1552924174" | awk '{print strftime("%Y/%m/%d", $1) }'
2019/03/18

strftime()GNUawkとLinuxではサポートされていますが、mawkBSDではサポートされていませんawk

答え3

私は次の方法でそれをしました

`echo "Location|1111|222222|333333|Doe|John|19900723|19900724|19900725"| awk -F "|" '{$NF=substr($NF,1,4)"/"substr($NF,5,2)"/"substr($NF,7,2);$(NF-1)=substr($(NF-1),1,4)"/"substr($(NF-1),5,2)"/"substr($(NF-1),7,2);$(NF-2)=substr($(NF-2),1,4)"/"substr($(NF-2),5,2)"/"substr($(NF-2),7,2);print $0}'| sed "s/ /`|/g"

出力

echo "Location|1111|222222|333333|Doe|John|19900723|19900724|19900725"| awk -F "|" '{$NF=substr($NF,1,4)"/"substr($NF,5,2)"/"substr($NF,7,2);$(NF-1)=substr($(NF-1),1,4)"/"substr($(NF-1),5,2)"/"substr($(NF-1),7,2);$(NF-2)=substr($(NF-2),1,4)"/"substr($(NF-2),5,2)"/"substr($(NF-2),7,2);print $0}'| sed "s/ /|/g"


Location|1111|222222|333333|Doe|John|1990/07/23|1990/07/24|1990/07/25

答え4

Perl以下の方法を使用してこれを実行できます。

入力する:

$ cat file
Location|1111|222222|333333|Doe|John|19900723|19900724|19900725

$ perl -lpe 's#\|\K([0-9]{8})(?=(?:(?:\|[0-9]{8}){0,2})$)#join "/", unpack "A4A2A2", $1#ge' file
Location|1111|222222|333333|Doe|John|1990/07/23|1990/07/24|1990/07/25

説明する:

  • -lRS = ORS = "\n"に設定
  • -p上記で設定したレコード区切り文字を使用して、入力ファイルのレコードを読み取ります。さらに、次のレコードを読み取る前に、現在のレコードが標準出力として印刷されます。
  • -ePerl$_()から読み取った各レコードに、このオプションの後に続くコードを適用します。
  • 行の終わりを見る前に、regex前に垂直バーがあり、その後に同じ種類の隣人が最大2つの8桁の数字を探します。彼らはキャプチャに保存されます$1
  • 各キャプチャはパターンに基づいて解凍され、次にパターンが一緒にスラッシュ$1A4A2A2れます。

余分:

$ perl -F'[|]' -pale '$_ = join "/", unpack "A4A2A2" for @F[-3..-1]; $_ = join "|", @F'

関連情報