awk - 删除多个字段后如何删除标题剩余空格?
问题描述
(抱歉,我会将“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 个已删除字段中的剩余空格?感谢您阅读到这里。
解决方案
这是对单个行的简单替换,这是 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
只要您的文件名不能包含换行符,上述内容就可以工作。
推荐阅读
- facebook - 永久菜单不显示
- list - 如何使用数字和字母正确排序 Flutter 列表
- sql - 注入安全“SELECT FROM table WHERE column IN list;” 使用 python3 和 sqlite3
- ios - 在 Swift 中的 SceneKit 场景中不断渲染新的子节点对象
- android - Android 在 onCreate 活动之外访问视图绑定 val
- sql - 在 Slick 中过滤时单引号会导致问题
- c# - 获得答案后,不再为用户分配相同的问题
- sql-server - 使用键/值结构修改 XML 的一部分
- callback - Bokeh + Jupyter - 如何在同一个 JS 回调中更新两个字形和图形
- sublimetext3 - Sublime Text 3 - 具有 csv 范围的片段?