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를 어떻게 수정합니까(숫자는 다를 수 있으며 호스트에는 0, 1, 2 등의 별칭이 있을 수 있음)?

공백은 구분 기호이며 별칭은 호스트 이름 뒤에 오고 항상 "#"으로 끝납니다.

답변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 }' 

관련 정보