다음 형식의 레코드가 포함된 파일이 있습니다.
D20200826,S2927,977,1
예상 출력:
D20200819,S2927,977,1
이제 제가 달성하고 싶은 것은 어떻게든 날짜(첫 번째 열)를 지난 7일로 이동할 수 있는지입니다. 즉, 현재 날짜가 29일 경우 22일이 되도록 하고 싶습니다.
답변1
awk
시간 관련 함수 mktime()
및 strftime()
( mawk
또는 GNU awk
) 가 있다고 가정하면 awk
스크립트는
BEGIN {
OFS = FS = ","
}
{
t = mktime(sprintf("%4d %.2d %.2d 00 00 00",
substr($1,2,4),
substr($1,6,2),
substr($1,8,2)));
$1 = substr($1,1,1) strftime("%Y%m%d", t - 7*24*60*60)
print
}
여러 호출을 사용하여 첫 번째 쉼표로 구분된 열의 날짜 사양을 분석 substr()
하고 를 사용합니다 mktime()
.
YYYYMMDD
그런 다음 결과 타임스탬프 를 7일(초 단위)만큼 줄이고 strftime()
. 그런 다음 결과 날짜 문자열은 수정된 전체 행을 인쇄하기 전에 D
첫 번째 열 데이터의 첫 번째 문자(예에서는 a)와 함께 첫 번째 열에 할당됩니다 .
일부 데이터에 대해 위 스크립트를 테스트합니다.
$ cat file
D20200826,S2927,977,1
D20200106,S2927,977,1
$ awk -f script.awk file
D20200819,S2927,977,1
D20191230,S2927,977,1
약간 더 짧은 변형:
BEGIN { OFS = FS = "," }
{
$1 = substr($1,1,1) strftime("%Y%m%d",
mktime(sprintf("%4d %.2d %.2d 00 00 00",
substr($1,2,4),
substr($1,6,2),
substr($1,8,2))) - 7*24*60*60)
}
1
그리고 "한 줄"로:
awk -F, '{ $1 = substr($1,1,1) strftime("%Y%m%d",mktime(sprintf("%4d %.2d %.2d 00 00 00",substr($1,2,4),substr($1,6,2),substr($1,8,2)))-7*24*60*60) }; 1' OFS="," file
답변2
멍하니 있을 뿐
awk -F, '{$1 = strftime("D%Y%m%d",\
mktime(gensub(/.(.{4})(.{2})(.{2})/, "\\1 \\2 \\3 0 0 0", 1, $1))-7*3600*24)}1' OFS=, file