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