在 awk 中的输出末尾列出输入的“中间”部分

在 awk 中的输出末尾列出输入的“中间”部分

这是关于主机文件的。

输入:

1.2.3.4 foooo00001 foo001 # AIX bar0003 NOSLS NOSLS NOCOMMENT
2.3.4.1 foooo00002 foo002 fooo0002 # Linux bar0003 NOSLS NOSLS NOCOMMENT

输出:

echo "$INPUT" | awk '{print $(NF-3)";"$2";"$1";"$(NF-2)";"$(NF-1)}'
bar0003;foooo00001;1.2.3.4;NOSLS;NOSLS
bar0003;foooo00002;2.3.4.1;NOSLS;NOSLS

但我们需要这个输出:

echo "$INPUT" | awk SOMEMAGIC
bar0003;foooo00001;1.2.3.4;NOSLS;NOSLS;foo001
bar0003;foooo00002;2.3.4.1;NOSLS;NOSLS;foo002;fooo0002

问题:我们如何修改 awk 来附加别名(数量可能会有所不同,主机可以有零个、一个、两个等别名)?

空格是分隔符,别名位于主机名之后,并且始终以“#”结尾。

答案1

如果你喜欢awk尝试一下

echo "$INPUT" | \
awk -v OFS=';' '
{for(i=4;$i!="#";i++)
     $3=$3 OFS $i
 print $(NF-3),$2,$1,$(NF-2),$(NF-1),$3}'

你可以用 GNU 做同样的事sed

echo "$INPUT" | \
sed -r 's/(\S*)( \S* )(.*) # \S* (\S*)( .* )\S*/\4\2\1\5\3/;s/ /;/g'

答案2

你可以试试这个:

echo "$INPUT" | awk '{ for (i = 1; i < NF; i++) { if ($i ~ /#/) { pos = i; break; } } } { for (i = 3; i < pos; i++) s = s";"$i; print $(NF-3)";"$2";"$1";"$(NF-2)";"$(NF-1)s }' 

相关内容