在Awk中打印字段之间的字符

3
我试过在谷歌上搜索我的问题的答案,我相信答案已经存在,但我不知道该搜索什么。基本上,我想做的是从文件中取一行,抓取最后2个字段(由"\"分隔),然后打印出这两个字段。
但是,我希望这些字段被打印出来时之间有2个反斜杠(我正在处理Windows路径)。这是我的语句。
$ line = C:\Windows\System32\folder1\folder2\folder3\executable.exe

$ echo $line | awk -F "\\" '{print $(NF-2)$(NF-0)}'

我希望输出返回 folder3\\executable.exe

我的awk经验有限。谢谢您提前的帮助。

3个回答

2

从命令行开始:

$ echo $line | awk 'BEGIN{FS="\\"; OFS="\\\\"} {print $(NF-1), $NF}'

将会给你

folder3\\executable.exe

针对您的line

FS 设置处理的行的字段分隔符,OFS 则是输出字段分隔符。双斜杠 \\ 是为了转义单个反斜杠 \ 的特殊含义。

请注意,您对line的赋值应该将字符串用""括起来,且等号前后不应有空格。例如:

line="C:\Windows\System32\folder1\folder2\folder3\executable.exe"

或者,使用这个脚本(so.awk)

BEGIN { FS="\\"
        OFS="\\\\"}
{print $(NF-1), $NF}

如果以 echo $line | awk -f so.awk data.txt 的方式调用,将会输出相同的结果,其中data.txt包含你的一个(或多个)路径。如果需要打印前导双反斜杠,则可以使用print "", $(NF-1), $NF 来添加一个空字符串在开头,这个方法是由@Dennis Williamson在评论中提出的。

太棒了!!非常感谢。我在你回答完整问题之前就提出了那个问题。这太好了。谢谢。 - Jaron Bradley
@JaronBradley:打印前导双反斜杠:print "", $NF, $(NF-1) - Dennis Williamson
@Levon:为什么你把问题中的前导双反斜杠删除了? - Dennis Williamson
@DennisWilliamson 很好/有用的观点(而且很容易实现)如果需要的话 - 谢谢(尽管 OP 只提到打印最后 2 个字段,中间带有 \\\ - 但以防万一 :) - Levon
@DennisWilliamson 因为 OP 说他们想要打印最后2个字段,并在它们之间使用 \\\(无法使用双引号:- /).. 我只是使输出与文本一致(以及 OP 对我的答案的接受)。 - Levon
我会请楼主澄清。 - Dennis Williamson

0
你想设置的变量是OFS,即输出字段分隔符。

0
你还可以使用 rev 来翻转字符串,在 '\' 分隔符上分割您的字符串,然后获取数组中的前两个字符串。最后,使用之前的分隔符 '\' 组成字符串并再次翻转。
翻转操作是必要的,因为您不总是知道根目录和最后一个目录之间的子目录数量。

tac 反转行的顺序(从上到下)。你指的是 rev,它将从左到右反转。 - Dennis Williamson
你说得对,感谢指正。我会立即进行编辑。 - Gianni B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接