
다음과 같은 데이터 세트가 있습니다.
user1 1234 01/01/2020
user2 2345 02/02/2020
사용자 이름과 ID 번호를 유지하면서 세 번째 열(날짜)을 EPOCH로 변환해야 합니다.
user1 1234 1577862000
user2 2345 1580626800
변환 및 인쇄 작업을 수행할 수 있었지만 새 날짜가 새 줄에 추가됩니다.
$awk '{print($1,$2)}; system("date -d "$3" +%s")' data
user1 1234
1577862000
user2 2345
1580626800
새 EPOCH 날짜를 열 1 및 2와 같은 줄에 배치하려면 어떻게 해야 합니까?
답변1
print
기본적으로 개행 문자를 추가합니다. 사용 printf
:
awk '{printf "%s %s ",$1,$2; system("date -d "$3" +%s")}' data
특수 출력 필드 구분 기호가 OFS
정의된 경우 다음을 사용할 수 있습니다.
awk '{printf "%s%s%s%s",$1,OFS,$2,OFS; system("date -d "$3" +%s")}' data
각각은 %s
에 대한 나머지 인수 중 하나를 가져옵니다 printf
.
산출:
user1 1234 1577847600
user2 2345 1580612400
답변2
GNU awk(일명)가 있는 경우 gawk
내장된 시간 mktime
함수를 사용할 수 있습니다(단, 입력 날짜 형식을 먼저 조작해야 함).
$ gawk 'split($3,a,"/") {$3 = mktime(sprintf("%04d %02d %02d 00 00 00",a[3],a[2],a[1]))} 1' data
user1 1234 1577854800
user2 2345 1580619600
또는 Miller는 C 스타일 strptime
과 다음을 제공합니다 strftime
.
$ mlr --nidx put '$3 = strftime(strptime($3,"%d/%m/%Y"),"%s")' data
user1 1234 1577854800
user2 2345 1580619600
또는 Perl에서도 Time::Piece 모듈을 사용하여 유사하게:
$ perl -MTime::Piece -alne '
$t = pop @F; print join " ", @F, Time::Piece->strptime($t,"%d/%m/%Y")->strftime("%s")
' data
user1 1234 1577854800
user2 2345 1580619600