使用 awk 在该行前面添加该行的特定字段

使用 awk 在该行前面添加该行的特定字段

使用awk,我尝试$4也在行的开头打印输入行 ( ) 的第四个字段。

我尝试过以下代码,但它打印了字符串多于该行:

awk -F"[--]" '{print $4 ;print$0}' file

该字符串是随机的,因此我无法使用字符串名称。

输入如下所示:

/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

通过上面的代码我得到:

320
/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

我需要输出如下:

320/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

感谢帮助!

答案1

默认情况下,单独的打印语句将打印单独的记录(行)。使用单个print、 连接$4$0

% awk -F- '{print $4 $0}' input
320/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

答案2

如果行开头的一些破折号消失,则很难通过字段编号选出要添加到每行前面的字符串,因为它可能并不总是字段 4,如

$ cat file
/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
/example.origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
/example.origin.live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

相反,以下代码会挑选出每行上的第二个-分隔单词:

$ sed 's/^\([^:]*:[^-]*-\([^-]*\)\)/\2\1/' file
320/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
320/example.origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
320/example.origin.live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

或者,可以说更具可读性awk

$ awk -F ':' '{ split($2,a,"-"); print a[2] $0 }' file
320/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
320/example.origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
320/example.origin.live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

假设该行基本上是两个:分隔字段,然后将其中的第二个字段拆分-并使用结果字段中的第二个字段进行输出。

如果每行的结束位具有静态格式,那么您显然可以从末尾而不是从开头开始对字段进行计数,并awk像这样使用:

$ awk -F '-' '{ print $(NF - 5) $0 }' file
320/example-origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
320/example.origin-live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9
320/example.origin.live/ngrp:tennis-320-fd1d9b92-69e2-446c-a3e6-45b33a55efc9

相关内容