Linux에서 데이터 조작

Linux에서 데이터 조작

1개의 파일에 데이터가 있습니다.

예:

a1b1:online                                                                        
xxxx:offline                                                              
wxyz:enable                                                      
a2b2:online                                           
txtx:disable                              

단일 데이터의 경우 문제가 되지 않지만 온라인의 이중 정보는 어떻습니까?

다음과 같은 정보를 어떻게 표시할 수 있나요?

data a1b1 a2b2 are online    --- how to get this                          
data xxxx  are offline    -- no issue                                      
data wxyz are enable      -- no issue                                           

답변1

$ awk -F: 'a[$2] {a[$2] = a[$2]" "$1; next};
           {a[$2]=$1};

           END {for (s in a) { print "data " a[s] " are " s }}' input.txt 
data xxxx are offline
data txtx are disable
data a1b1 a2b2 are online
data wxyz are enable

이는 연관 배열 a(상태 $2로 입력됨)을 사용하여 해당 상태의 호스트($1)를 저장합니다. 해당 상태에 대한 배열 요소가 이미 존재하는 경우 공백과 호스트 이름이 추가됩니다. 그렇지 않으면 호스트 이름으로 요소를 생성하면 됩니다.

(나는 그들이 호스트 이름이라고 가정하고 있습니다 - 그것은 중요하지 않습니다. 코드는 정의가 아닌 데이터에서 작동합니다)

전체 입력 파일을 읽은 후 원하는 형식으로 배열을 인쇄합니다.

의 연관 배열은 awk특정 순서로 저장되지 않으므로 출력은 순서가 지정되지 않습니다. 정렬해야 하는 경우 awk 스크립트에서 수행할 수 있지만 출력을 sort.

상태에만 관심이 있는 경우 online출력을 로 파이프하거나 grepawk 스크립트에서 실행할 수 있습니다. 예를 들어

$ awk -F: '!/online/ {next};
           a[$2] {a[$2] = a[$2]" "$1; next};
           {a[$2]=$1};

           END {for (s in a) { print "data " a[s] " are " s }}' input.txt 
data a1b1 a2b2 are online

답변2

주문하다

for i in `awk -F ":" '{print $NF}' filename | sed '/^$/d'| awk '{if(!seen[$NF]++)print }'`; do  awk -v i="$i" -F ":" '$NF == i{print $1}' filename |sed "N;s/\n/ /g"| awk -v i="$i" '{print "data" " " $0" " "are "i}'; done

산출

data a1b1 a2b2 are online
data xxxx are offline
data wxyz are enable
data txtx are disable

관련 정보