将 Linux 路径解析为 .csv 文件 bash 中的列

将 Linux 路径解析为 .csv 文件 bash 中的列

我有一个 .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命令捕获appapp_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 解决方案完美运行!

相关内容