awk 字段的操作

awk 字段的操作

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

/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替换为捕获的组。

相关内容