首页 > 解决方案 > 删除多个字段后如何删除标题剩余空格?

问题描述

(抱歉,我会将“I”写为“i”,因为“I”总是与管道字符混淆;)

我有一个 tar 文件,所以我可以通过“-t”选项看到一个列表。每行将如下所示。

-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav

我们可以看到路径是“017_0401/”,文件名是“345 alice.wav”,其中有空格。

我需要的只是文件名和大小信息。

对于“awk”,$3 是大小,$6 和其余部分是文件名。

不幸的是,许多文件的名称中有不可预测的空格数(不是我命名的)。

我希望“awk”使这个列表如下所示。("文件名"\t"大小")

017_0401/345 alice.wav [tab] 287110

所以,我尝试了这样的“awk”:

   cat tarlist.txt | awk '{zsize=$3; $1=$2=$3=$4=$5=""; print $0"\t"zsize;}'
   #rem: i had to use $0 because many files have spaces in the name.

但结果将有如下所示的标题空间。

[5spaces]017_0401/345 alice.wav [tab] 287110

我需要的是...

017_0401/345 alice.wav [tab] 287110

我该怎么做才能消除 5 个已删除字段中的剩余空格?感谢您阅读到这里。

标签: awktar

解决方案


这是对单个行的简单替换,这是 sed 创建的目的。使用 GNU sed-E\s/\S

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    sed -E 's/^(\S*\s*){2}(\S*)\s*(\S*\s*){2}(.*)/\4\t\2/'
017_0401/345 alice.wav  287110

对于任何 POSIX sed:

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    sed 's/^\([^[:space:]]*[[:space:]]*\)\{2\}\([^[:space:]]*\)[[:space:]]*\([^[:space:]]*[[:space:]]*\)\{2\}\(.*\)/\4\t\2/'
017_0401/345 alice.wav  287110

如果您更喜欢 awk,可以使用 GNU awk \s/\S

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    awk -v OFS='\t' '{size=$3; sub(/^(\S+\s+){5}/,""); print $0, size}'
017_0401/345 alice.wav  287110

或使用任何 POSIX awk:

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    awk -v OFS='\t' '{size=$3; sub(/^([^[:space:]]+[[:space:]]+){5}/,""); print $0, size}'
017_0401/345 alice.wav  287110

只要您的文件名不能包含换行符,上述内容就可以工作。


推荐阅读