助けが必要です。次の形式のパイプで区切られたファイルがあります。
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ではサポートされていますが、mawk
BSDではサポートされていません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
説明する:
-l
RS = ORS = "\n"に設定-p
上記で設定したレコード区切り文字を使用して、入力ファイルのレコードを読み取ります。さらに、次のレコードを読み取る前に、現在のレコードが標準出力として印刷されます。-e
Perl
$_
()から読み取った各レコードに、このオプションの後に続くコードを適用します。- 行の終わりを見る前に、
regex
前に垂直バーがあり、その後に同じ種類の隣人が最大2つの8桁の数字を探します。彼らはキャプチャに保存されます$1
。 - 各キャプチャはパターンに基づいて解凍され、次にパターンが一緒にスラッシュ
$1
さA4A2A2
れます。
余分:
$ perl -F'[|]' -pale '$_ = join "/", unpack "A4A2A2" for @F[-3..-1]; $_ = join "|", @F'