.csv 파일 bash의 열에 대한 Linux 경로 구문 분석

.csv 파일 bash의 열에 대한 Linux 경로 구문 분석

다음과 같이 처리한 .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 솔루션이 완벽하게 작동합니다!

관련 정보