13개의 열이 포함된 CSV 파일에 열을 추가하려고 합니다.
다음 명령을 실행하고 있습니다.
awk -F "," 'BEGIN{ OFS="," } {gsub(/"/, "", $1);$14=system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"");print}' mycsv.csv > test
결과적으로 13 필드 끝에 다음이 추가됩니다 ^M,1
(또는 ^M,0
새 열의 값($14여야 함)이 두 번째 행에 추가됩니다.
그래서 csv가 깨집니다.
여기서 문제는 무엇입니까?
입력 예:
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
예상 출력:
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now", 1485771295
고쳐 쓰다:
이것:
awk -F"," 'BEGIN{ OFS="," } {gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")|getline $14; print}' mycsv.csv > test
종료 상태에는 0이나 1이 없지만 새 줄 특성이 system
있으므로 ^M
$14가 새 줄에 인쇄됩니다.
업데이트 2:
$ cat mycsv.csv
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
행위:
$ awk -F"," '{printf; printf ","; gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")}' mycsv.csv > test
Failed conversion of ``1/30/2017 11:14:55 AM'' using format ``%m/%d/%Y %H:%M:%S %p''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
결과 파일:
cat을 실행하면 다음이 표시됩니다.
$ cat test
,1485771295 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
,148577129511:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
vim으로 열면 ^M
after가 표시됩니다."Now"
업데이트 3:
이상한 점은 전체 줄을 인쇄할 수 없다는 것입니다. 다음은 쓰레기를 제공합니다 :
$awk -F',' '{ printf $0 }' mycsv.csv
","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now""
그러나 이것은 작동합니다(그러나 추가된 새 줄을 인쇄하고 싶지는 않습니다):
$ awk -F',' '{ print $0; }' mycsv.csv
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"
답변1
awk(1)
우리가 읽은 것에서
system(cmd)
executes cmd and returns its exit status
따라서 0은 시스템 명령 결과(정상 종료)에 의해 반환된 종료 상태입니다. 이 경우 간단한 예와 같이 표준 출력이 올바른 위치에 배치되도록 기존 열, 쉼표를 인쇄한 다음 날짜를 인쇄해야 할 수도 있습니다.
(echo a,b,c; echo e,f,g) \
| awk -F, '{printf "%s", $0;printf ",";system("echo more")}'
첫 번째 열의 입력으로 새 열을 추가하는 것은 크게 다르지 않습니다. 데이터를 인쇄하고, 쉼표를 추가하고, $1
후속 시스템을 변경하고, 시스템 호출을 수행합니다.
$ cat input
"1/30/2017 11:14:55 AM","I","M"
$ awk -F, '{printf "%s", $0;printf ",";gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")}' input
"1/30/2017 11:14:55 AM","I","M",1485774895