analisar caminhos linux como colunas em um arquivo .csv bash

0

Eu tenho um arquivo de dados .csv que eu manipulei para ficar assim:

   -------------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

Que foi fantástico! Até que recebi um feedback e uma solicitação para subdividir a coluna "CAMINHO E NOME DE ARQUIVO" como tal:

    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

Omitindo "/ Proj / abc" de todos os registros e removendo "conf" do caminho

Eu tentei muitos aplicativos diferentes do awk, sed, tr, etc, mas não consigo acertar isso. Talvez haja alguma lógica em loop para empregar aqui?

    
por SSDdude 14.06.2018 / 17:06

5 respostas

1

Ignorando o cabeçalho e assumindo que o texto no arquivo não possui espaços no início da linha (existe na sua pergunta):

$ sed -e 's@/Proj/abc/\([^/]*\)/\([^/]*\)/conf/@,,@' 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

O comando sed captura as sequências app e app_pit (que, suponho, podem variar) e substitui o caminho nos dados originais por vírgulas entre elas, deixando o último bit do caminho como seu próprio campo.

Redirecione isso para um novo arquivo e, em seguida, corrija o cabeçalho (se necessário).

    
por 14.06.2018 / 17:14
1
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

Apenas um conjunto estendido de substituições de fluxo.

A primeira muda a primeira linha para começar com a string começando com LB que você deseja.

O segundo remove / Proj / abc /.

O terceiro remove / conf.

O quarto e o quinto substituem o segundo e o primeiro atacante por vírgulas.

Saída:

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
    
por 14.06.2018 / 17:58
0

Observe que isso pegará fogo se algum dos nomes de arquivo tiver , ou / :

$ 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
    
por 14.06.2018 / 17:12
0

Awk solução:

awk 'BEGIN{ FS = OFS = "," }
     NR == 1{ $1 = "LB,-PROJ---,FILENAME----" }
     NR > 1{
         gsub("/(Proj/abc/|conf)", "", $1);
         gsub("/", ",", $1)
    }1' file

A saída:

   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
    
por 14.06.2018 / 17:21
0

RESOLVIDO!

    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

Obrigado Nasir Riley, sua solução sed funcionou perfeitamente !!

    
por 19.06.2018 / 19:09