다음과 같이 처리한 .csv 데이터 파일이 있습니다.
-------------PATH AND FILE NAME--------,USER--,DATE-----,TIME---,STATUS
/Proj/abc/app/app_pit/conf/HUB_TEST.apx,uJones,4/24/2018,5:55:58,OK
/Proj/abc/app/app_pit/conf/test_acqit1.apx,uSmith,3/8/2018,10:16:41,OK
/Proj/abc/app/app_pit/conf/test_bkfs.apx,uHarry,/26/2018,9:47:03,OK
기이! "경로 및 파일 이름" 열을 다음과 같이 분류해 달라는 피드백과 요청을 받기 전까지는:
LB,-PROJ---,FILENAME----,USER--,DATE-----,TIME---,STATUS
app,app_pit,HUB_TEST.apx,uJones,4/24/2018,5:55:58,OK
app,app_pit,test_acqit1.apx,uSmith,3/8/2018,10:16:41,OK
app,app_pit,test_bkfs.apx,uHarry,/26/2018,9:47:03,OK
모든 레코드에서 "/Proj/abc"를 생략하고 경로에서 "conf"를 제거합니다.
나는 다양한 awk, sed, tr 등의 애플리케이션을 시도해 보았지만 이 작업을 수행할 수 없는 것 같습니다. 어쩌면 여기에 순환 논리를 사용해야 할까요?
답변1
헤더를 무시하고 파일의 텍스트에 줄 시작 부분에 공백이 없다고 가정합니다(귀하의 질문에 있는 것처럼).
$ sed -e 's@/Proj/abc/\([^/]*\)/\([^/]*\)/conf/@\1,\2,@' file
-------------PATH AND FILE NAME--------,USER--,DATE-----,TIME---,STATUS
app,app_pit,HUB_TEST.apx,uJones,4/24/2018,5:55:58,OK
app,app_pit,test_acqit1.apx,uSmith,3/8/2018,10:16:41,OK
app,app_pit,test_bkfs.apx,uHarry,/26/2018,9:47:03,OK
이 sed
명령은 문자열(다양할 수 있다고 생각함)을 캡처 app
하고 app_pit
경로의 마지막 비트를 자체 필드로 유지하면서 원본 데이터의 경로를 쉼표로 구분된 이러한 문자열로 바꿉니다.
새 파일로 리디렉션하고 필요한 경우 헤더를 수정합니다.
답변2
sed -e 's|-------------PATH AND FILE NAME--------,USER--,DATE-----,TIME---,STATUS|LB,-PROJ---,FILENAME----,USER--,DATE-----,TIME---,STATUS|' -e 's|/Proj/abc/||g' -e 's|/conf||g' -e 's|/|,|2' -e 's|/|,|1' file
확장된 스트림 교체 세트입니다.
LB
첫 번째는 원하는 문자열로 시작하도록 첫 번째 줄을 변경합니다.
두 번째는 /Proj/abc/를 삭제합니다.
세 번째는 /conf를 제거합니다.
두 번째와 첫 번째 슬래시를 네 번째와 다섯 번째 슬래시를 쉼표로 바꿉니다.
산출:
LB,-PROJ---,FILENAME----,USER--,DATE-----,TIME---,STATUS
app,app_pit,HUB_TEST.apx,uJones,4/24/2018,5:55:58,OK
app,app_pit,test_acqit1.apx,uSmith,3/8/2018,10:16:41,OK
app,app_pit,test_bkfs.apx,uHarry,/26/2018,9:47:03,OK
답변3
,
파일 이름에 또는 가 포함되어 있으면 실행됩니다 /
.
$ awk -F "[/,]" -v OFS="," 'BEGIN { print "LB", "-PROJ--", "FILENAME----", "USER--", "DATA-----", "TIME---", "STATUS" }NR!=1{print $4,$5,$7,$8,$9"/"$10"/"$11,$12,$13}' input
LB,-PROJ--,FILENAME----,USER--,DATA-----,TIME---,STATUS
app,app_pit,HUB_TEST.apx,uJones,4/24/2018,5:55:58,OK
app,app_pit,test_acqit1.apx,uSmith,3/8/2018,10:16:41,OK
app,app_pit,test_bkfs.apx,uHarry,/26/2018,9:47:03,OK
답변4
해결되었습니다!
sed -e 's|-------------PATH AND FILE NAME--------,USER--,DATE-----,TIME---,STATUS|LB,-PROJ---,FILENAME----,USER--,DATE-----,TIME---,STATUS|' -e 's|/Proj/abc/||g' -e 's|/conf||g' -e 's|/|,|2' -e 's|/|,|1' file
Nasir Riley에게 감사드립니다. sed 솔루션이 완벽하게 작동합니다!