awk 및 시스템을 사용하여 인쇄하고 csv 파일에 추가

awk 및 시스템을 사용하여 인쇄하고 csv 파일에 추가

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으로 열면 ^Mafter가 표시됩니다."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

관련 정보