我有一个包含完整路径的文件:
/home/usr/file_name_delimited_by_underscore_123.txt
/home/usr/another_example_456.rar
我想从不带扩展名的路径打印文件名,并在其旁边打印最后一个_
.
输出:
file_name_delimited_by_underscore_123 123
another_example_456 456
我想出了一种使用管道 awk 命令获得所需输出的方法:
cat file | awk -F[/.] '{print $(NF-1)}' | awk -F_ '{print $0" "$NF}'
有没有一种方法可以在不使用管道的情况下实现这一目标?
我的问题归结为是否可以对 awk 解析的字段执行操作?
感谢您的帮助。
答案1
是的,您可以在字段上执行任何您喜欢的操作。例如:
$ cat file | awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1)" "a[n]}'
file_name_delimited_by_underscore_123 123
another_example_456 456
当然,你不需要cat
这里;您可以awk
直接读取文件 - 由于默认的输出字段分隔符OFS
是空格,因此将结果写为单独的输出字段而不是字符串连接会更惯用:
awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1), a[n]}' file
答案2
对于任何 sed:
$ sed 's:.*/\(.*_\(.*\)\)\..*:\1 \2:' file
file_name_delimited_by_underscore_123 123
another_example_456 456
答案3
您可以使用sed
:
$ sed -e 's;^.*/\(.*_\)\([0-9]*\)\.[^\.]*$;\1_\2 \2;' file
file_name_delimited_by_underscore_123 123
another_example_456 456
^.*/
删除路径。
\(.*_\)
捕获名称直到最后一个下划线。
\.[^\.]*
删除扩展名。
\1\2 \2
替换为捕获的组。