또 다른 sed 질문

또 다른 sed 질문

매일 약 200-50GB의 CSV 파일을 내보냅니다. 각 CSV 파일의 첫 번째 필드는 유사한 날짜 정보입니다. 각 CSV 파일에는 22개의 필드가 있습니다.

/data/exported$ head  0000_processmessages_export_20170509_000144.csv | awk -F ";" '{print $1}'
2017-05-08T21:59:10.263Z
2017-05-08T21:59:10.000Z
2017-05-08T21:59:10.000Z
2017-05-08T18:59:11.000Z
2017-05-08T18:59:11.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z
2017-05-08T21:00:00.000Z

따라서 기본적으로 csv 파일의 각 행 끝에 2개의 필드(Field22 및 Field23)를 추가하려고 합니다. 이러한 필드는 YYYYDMMHH 및 YYYYMMDD와 같은 형식이며 행의 첫 번째 필드에서 추출해야 합니다. 그래서

Field 23    Field 24 
2017050821  20170508
2017050821  20170508
2017050821  20170508
2017050818  20170508
2017050818  20170508
2017050821  20170508
2017050821  20170508
2017050821  20170508
2017050821  20170508
2017050821  20170508

sed 및/또는 bash 명령을 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

댓글에서 언급했듯이, 그러한 중복된 정보를 갖는 것은 어리석은 것 같습니다. 하지만 꼭 이 작업을 수행해야 한다면 캡처 그룹과 역참조를 사용하세요.

sed 's/^\(....\)-\(..\)-\(..\)T\(..\).*/&;\1\2\3\4;\1\2\3/'

답변2

perl -F\; -pale '$_ .= join ";", q{}, $F[0] =~ tr/T-//dr =~ /^((\d{8})\d{2})/' CSV.file

답변3

귀하의 입력은 - 구분된 것으로 보이 ;므로 출력도 비슷하게 구분되기를 원한다고 가정합니다.

$ cat file.csv
2017-05-08T21:59:10.263Z;some;other;fields
2017-05-08T21:59:10.000Z;some;other;fields
2017-05-08T21:59:10.000Z;some;other;fields
2017-05-08T18:59:11.000Z;some;other;fields
2017-05-08T18:59:11.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
2017-05-08T21:00:00.000Z;some;other;fields
$ awk -F ';' -v OFS=';' '{ split($1,a,":"); gsub("[^0-9]","",a[1]); $(NF+1)=a[1]; $(NF+1)=substr(a[1],0,8); print}' file.csv
2017-05-08T21:59:10.263Z;some;other;fields;2017050821;20170508
2017-05-08T21:59:10.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:59:10.000Z;some;other;fields;2017050821;20170508
2017-05-08T18:59:11.000Z;some;other;fields;2017050818;20170508
2017-05-08T18:59:11.000Z;some;other;fields;2017050818;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508
2017-05-08T21:00:00.000Z;some;other;fields;2017050821;20170508

프로그램 awk은 첫 번째 ;구분 기호 필드를 가져와서 :. 그런 다음 필드의 첫 번째 부분(첫 번째 부분 앞의 비트)에서 숫자가 아닌 모든 항목을 제거하고 :이를 새 필드로 끝에 추가합니다. 그런 다음 첫 번째 새 필드의 처음 8자만 포함하는 두 번째 새 필드가 줄 끝에 추가됩니다. 그런 다음 새 줄을 인쇄하십시오.

관련 정보