awk 字段的操作

use*_*009 4 awk

我有一个包含完整路径的文件:

/home/usr/file_name_delimited_by_underscore_123.txt  
/home/usr/another_example_456.rar
Run Code Online (Sandbox Code Playgroud)

我想从没有扩展名的路径中打印文件名,并在它旁边打印最后一个_.

输出:

file_name_delimited_by_underscore_123 123
another_example_456 456
Run Code Online (Sandbox Code Playgroud)

我想出了一种使用管道 awk 命令获得所需输出的方法:

cat file | awk -F[/.] '{print $(NF-1)}' | awk -F_ '{print $0" "$NF}'
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有管道的情况下实现这一目标?

我的问题归结为是否可以对 awk 解析的字段执行操作?

谢谢你的帮助。

ste*_*ver 8

是的,您可以在字段上执行任何您喜欢的操作。例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

当然,cat这里不需要;您可以awk直接读取文件 - 由于默认输出字段分隔符OFS是一个空格,将结果写为单独的输出字段而不是字符串连接会更惯用:

awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1), a[n]}' file
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 6

使用任何 sed:

$ sed 's:.*/\(.*_\(.*\)\)\..*:\1 \2:' file
file_name_delimited_by_underscore_123 123
another_example_456 456
Run Code Online (Sandbox Code Playgroud)