shell awk在匹配“/”之前删除所有字符

63lcw9qa  于 2023-10-23  发布在  Shell
关注(0)|答案(6)|浏览(138)

对不起,我的英语不好,不是我的母语。我有一个文本文件,其中包含以下内容,该文件在“目录”列中不断变化:

DIRECTORY                          FILES      SIZE
documents/my_name/directory1/       2          96M
documents/my_name/directory2/       4          21M
documents/my_name//directory3/      1          43M

我想要的是删除绝对路径,只留下最后一个目录的名称。
注意:第三个目录写得正确,有些地址写有两个反斜杠。
结果会是这样的:

DIRECTORY       FILES       SIZE
directory1/       2          96M
directory2/       4          21M
directory3/       1          43M

或者这个

DIRECTORY       FILES       SIZE
directory1       2          96M
directory2       4          21M
directory3       1          43M

有没有一种方法可以使用awk Linux命令或其他命令?
请记住,路径可以是不同的长度,它是一个总是变化的文件。

2j4z5cfb

2j4z5cfb1#

看看这个

perl -pe 's:.*/([^/]+)/:\1:;s:/::g' file | column -t

perl -F"/" -lane 'print $F[-2], $F[-1] if @F >= 2 or $. == 1' file | column -t

perl -lane 'if ($.==1){print}else{($d,$f,$s)=@F;$d=~s/.*\/(.+?)\/$/$1/;print"$d\t$f\t$s"}' file | column -t

产出:

DIRECTORY   FILES  SIZE
directory1  2      96M
directory2  4      21M
directory3  1      43M
kh212irz

kh212irz2#

您可以使用awkmatch函数,其中包含regex。

awk '
BEGIN{OFS="\t"}
FNR==1{
  $1=$1
  print
  next
}
match($0,/\/[^/]+\/[[:space:]]+.*$/){
  print substr($0,RSTART+1,RLENGTH)
}
' Input_file | column -t
643ylb08

643ylb083#

您可以执行以下操作:

awk 'FNR==1{print; next}
{split($1,a,"/"); $1=a[length(a)-1]} 1' file  | column -t

图纸:

DIRECTORY   FILES  SIZE
directory1  2      96M
directory2  4      21M
directory3  1      43M
n3ipq98p

n3ipq98p4#

这对你有用吗?

rev file | cut -d/ -f 1,2 | rev

您还可以使用

sed -r 's#.*/(.*)/#\1/#' file
zlhcx6iw

zlhcx6iw5#

我已经使用awk命令和以下选项解决了我的问题:

awk -F "/" '{print $(NF-1), $NF}' file.txt

我不知道这在语法上是否正确,但它对我很有效。这样解决可靠吗?

xvw2m8pv

xvw2m8pv6#

假设路径中没有空格

$ cat file
DIRECTORY                          FILES      SIZE
documents/my_name/directory1        2          96M
documents/my_name/directory2/       4          21M
documents/my_name//directory3/      1          43M
documents/my_name//directory4       1          43M
documents/my_name/directory5//      1          43M
documents/my_name//directory6//     1          43M

$ awk 'BEGIN{OFS="\t"}{sub(/\/*$/,"",$1); n=split($1,a,"/"); $1=a[n]}1' file
DIRECTORY       FILES   SIZE
directory1      2       96M
directory2      4       21M
directory3      1       43M
directory4      1       43M
directory5      1       43M
directory6      1       43M

相关问题