awk: csv의 날짜/시간 열을 세 개의 별도 열로 분할

awk: csv의 날짜/시간 열을 세 개의 별도 열로 분할

나는 substr을 사용하여 날짜/시간 열, 다섯 번째 열(previous_test)을 마지막 세 개의 다른 열로 분할하려고 합니다.

입력하다:

id,tester,company,chief,previous_test,test,date,result,cost
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96

예상 출력:

id,tester,company,chief,previous_test,test,date,result,cost,day,month,year
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96,18,02,2019

나는 다음을 사용해 보았습니다.

awk -F, -v OFS="," '{s = substr($5, 1, 2)} {g = substr($5, 4, 2)} {l = substr($5, 7, 4)} {print s, g, l}' file.csv

내가 얻는 것은 기존 열에 추가된 세 개의 추가 열 대신 쉼표로 구분된 날짜뿐입니다.

출력을 세 개의 별도 열에 추가하는 방법이 누락되었습니다.

답변1

코드는 기존 열이 아닌 새 열의 하위 문자열 값만 인쇄합니다.

첫 번째 줄에는 특별한 처리가 필요합니다.

awk -F, -v OFS="," 'NR==1 { print $0,"day,month,year"; next }
{ s = substr($5, 1, 2);
  g = substr($5, 4, 2);
  l = substr($5, 7, 4);
  print $0, s, g, l}' file.csv

인쇄

id,tester,company,chief,previous_test,test,date,result,cost,day,month,year
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96,18,02,2019

설명하다:

  • 이 조건은 NR==1첫 번째 레코드/행에 유효합니다.
  • $0전체 입력 레코드/라인입니다.
  • next명령은 다음 레코드/라인으로 점프하고 현재 레코드/라인에 남아 있는 모든 명령을 건너뜁니다. 이는 첫 번째 레코드/행을 제외한 모든 레코드/행에 대해 추가 명령이 실행된다는 의미입니다.

편집하다:댓글에서 제안한대로올리비에 뒤라크, 이 함수를 사용하여 날짜 문자열 분할을 단순화할 수 있습니다 split.

awk -F, -v OFS="," 'NR==1 { print $0,"day,month,year"; next }
{ split($5,a,"/"); print $0, a[1], a[2], a[3] }' file.csv

답변2

분할이 필요하지 않으며 s를 s로 변경 하고 인쇄하면 $5됩니다 . GNU awk를 사용하면 다음을 수행할 수 있습니다 ./,gensub()

$ awk -F, '{print $0 FS (NR>1 ? gensub("/",FS,"g",$5) : "day,month,year") }' file
id,tester,company,chief,previous_test,test,date,result,cost,day,month,year
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96,18,02,2019

어떤 이상한 경우 :

$ awk -F, '{d=$5; gsub("/",FS,d); print $0 FS (NR>1 ? d : "day,month,year") }' file
id,tester,company,chief,previous_test,test,date,result,cost,day,month,year
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96,18,02,2019

답변3

다음 명령으로 완료

 awk -F "," 'NR==1{print $0",day,month,year"}NR == 2{print $0","substr($5,1,2)","substr($5,4,2)","substr($5,7,4)}' file

산출

id,tester,company,chief,previous_test,test,date,result,cost,day,month,year
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96,18,02,2019

관련 정보