![시간 열을 현재 시간으로 바꾸기](https://linux55.com/image/138785/%EC%8B%9C%EA%B0%84%20%EC%97%B4%EC%9D%84%20%ED%98%84%EC%9E%AC%20%EC%8B%9C%EA%B0%84%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EA%B8%B0.png)
ports.csv 파일에 다음과 같은 데이터가 있습니다.
파일 이름은포털.csv
ip,time,name
1.1.1.1,2018-08-15 11:05:28:268813353,1.13.0-0007
1.1.1.2,2018-08-16 11:05:32:016469121,1.13.0-0007
1.1.1.3,2018-08-16 11:06:42:316469121,1.13.0-0007
1.1.2.5,2018-08-16 11:15:52:416469121,1.13.0-0007
이러한 출력이 필요합니다. 시간 열 데이터는 현재 시간을 사용해야 하며 각 행에 다른 초가 있어야 합니다.
ip,time,name
1.1.1.1,2018-08-17 15:00:01,1.13.0-0007
1.1.1.2,2018-08-17 15:00:02,1.13.0-0007
1.1.1.3,2018-08-17 15:00:03,1.13.0-0007
1.1.2.5,2018-08-17 15:00:04,1.13.0-0007
답변1
NR
다음은 명령에서 전달된 epoch 타임스탬프를 증가시키기 위해 GNU Awk를 사용하는 옵션입니다 date
.
gawk -F, -v ts="$(date +%s)" '
BEGIN{OFS = FS}
NR > 1 {$2 = strftime("%Y-%m-%d %H:%M:%S", ts + NR - 1)}
1' portals.csv
ip,time,name
1.1.1.1,2018-08-17 09:47:17,1.13.0-0007
1.1.1.2,2018-08-17 09:47:18,1.13.0-0007
1.1.1.3,2018-08-17 09:47:19,1.13.0-0007
1.1.2.5,2018-08-17 09:47:20,1.13.0-0007
Perl에서도 비슷한 방법:
perl -MPOSIX -F, -lne '
BEGIN{$ts = time()};
$F[1] = strftime("%Y-%m-%d %H:%M:%S", localtime($ts + $. - 1)) if $. > 1;
print join ",", @F
' portals.csv
답변2
날짜/시간 필드 작업은 결코 쉬운 작업이 아니므로 완전한 솔루션을 위해서는 조금 더 노력해야 합니다. 입력 파일의 길이가 60줄 미만인 경우 다음을 시도해 보세요.
awk -F, -vDT="$(date +"%F %T")" 'NR > 1 {sub (/:..$/, sprintf (":%02d", NR-1), DT); $2 = DT} 1' OFS=, file
ip,time,name
1.1.1.1,2018-08-17 12:47:01,1.13.0-0007
1.1.1.2,2018-08-17 12:47:02,1.13.0-0007
1.1.1.1,2018-08-17 12:47:03,1.13.0-0007
1.1.1.2,2018-08-17 12:47:04,1.13.0-0007
1.1.1.3,2018-08-17 12:47:05,1.13.0-0007
1.1.2.5,2018-08-17 12:47:06,1.13.0-0007
아니면 조금 더 짧게,
awk -F, -vDT="$(date +"%F %H:%M")" 'NR > 1 {$2 = DT sprintf (":%02d", NR-1)} 1' OFS=, file
편집하다:입력 파일에서 이를 최대 99줄까지 확장하는 추가 요청의 경우 다음을 시도하십시오.
awk -F, -vDT="$(date +"%F %H:")" 'NR > 1 {$2 = DT sprintf ("%02d:%02d", int((NR-1)/60), (NR-1)%60)} 1' OFS=, file