使用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