명령의 열을 새 명령으로 분할

명령의 열을 새 명령으로 분할

자동으로 장치를 생성하는 스크립트를 작성하려고 합니다. 먼 길을 왔지만 막혔습니다.

소스 파일은 다음과 같습니다.

dev1 size 1024
dev2 size 1024
dev3 size 1024
dev4 size 512
dev5 size 512

스크립트에서 소스 파일은 $INVFILE 변수입니다. 그런 다음 명령을 내립니다.

cat $INVFILE | awk '{print $3}' | sort | uniq -c

다음과 같은 출력을 제공합니다.

   3 1024
   2 512

다음 명령에서 이 출력을 사용하여 다양한 크기와 개수를 사용하고 싶습니다(이 예에서는 첫 번째 줄만 사용하지만 스크립트에서는 함수에 "for i in"을 사용하고 싶습니다).

create dev count=3 size=1024MB

스크립트에서 이 작업을 어떻게 수행할 수 있나요? "for i in" 기능을 대체하는 더 쉬운 방법이 있나요?

답변1

awk는 다 할 수 있어요.

노력하다

awk '{ d[$3]++ ; } 
     END { for ( c in d ) 
        printf "create dev count=%d size=%dMB\n",d[c],c ;}' $INVFILE

작동하는 경우:

awk '{ d[$3]++ ; } 
   END { for ( c in d ) 
         printf "create dev count=%d size=%dMB\n",d[c],c ;}' $INVFILE |
bash

답변2

awk '{print $3}' $INVFILE | sort | uniq -c | \
while read a b ; do \
    create dev count=$a size=${b}MB ; \
done

~을 위한루프 주기당 ​​하나의 목록 항목만 사용됩니다.x_1 x_2 x_3 읽을 때...아무리 사용해도x_n에스예. (그러나 입력 파일의 한 줄에 있는 항목 수를 초과할 수 없습니다.)

노트,만약에2개 이상의 열이 있는 입력의 경우 위의 "read ab"를 "read ab c"로 변경합니다.$c루프에서는 사용되지 않지만 읽기가 나머지 줄을 할당하는 것을 방지합니다.$b.


첫 번째 파이프 라인은 다음과 같이 교체할 수 있습니다.데이터 혼합, 그리고$a&$b루프에서 교환:

datamash -W -s -g3 count 3 < $INVFILE | \
while read a b ; do \
    create dev count=$b size=${a}MB ; \
done

답변3

첫째, 'uniq' -명령에는 n개의 열을 무시하는 '-f N' 옵션이 있습니다.

그런 다음 "read"를 사용하여 입력의 필드를 변수에 넣을 수 있습니다.

따라서 요약하면 다음 명령은 입력 파일의 모든 줄에서 필요한 정보를 선택합니다.

cat input.txt | uniq -f2 -c | while read a b c d; do echo "command $a $d" ;done

"echo..."를 원하는 명령으로 바꾸세요.

관련 정보