>

다음 시나리오를 고려하십시오 :

echo 52=abcd_53=1_54=efgh_55=ijkl | awk -v time_tag="52=" -v start_time="54=" -v end_time="55=" '{p=index($0, time_tag)} {q=index($0, start_time)} {r=index($0, end_time)} /53=1/'

위의 명령이 실행 된 후 사용할 수 있도록 쉘 변수에서 p, q, r의 값을 얻고 싶습니다. 최종 목표는 다음과 같으므로 쉘 배열을 사용할 수 없습니다.

for line in $(cat $dir/$file | awk '/53=1')
do
    for word in $(echo $line | tr "_" "\n")
    do
        if [ ${word:0:3} == "52=" ] ; then
            time_tag=$word
        elif [ ${word:0:3} == "54=" ] ; then
            start_time=$word
        elif [ ${word:0:3} == "55=" ] ; then
            end_time=$word
        fi
    done
    echo $time_tag","$start_time","$end_time
done

빠른 실행을 위해 위의 실행을 다음과 같이 변경하고 싶습니다.

for line in $(cat $dir/$file | awk -v time_tag="52=" -v start_time="54=" -v end_time="55=" '{p=index($0, time_tag)} {q=index($0, start_time)} {r=index($0, end_time)} /53=1/')
do
    echo ${line:p:7}","echo ${line:q:7}","echo ${line:r:7}
done

나는 단지 awk 라인 자체에서 인덱스를 얻는다면 시간이 병목 현상이기 때문에 프로그램이 훨씬 더 빨라질 수 있다고 생각합니다.

  • 답변 # 1

    반환 값 이외의— 아니요, 그러나 쓸모없는 cat 를 제거하는 것은 어떻습니까  그리고 :

    $ cat file
    52=abcd_53=1_54=efgh_55=ijkl
    $ for i in file
      do 
        ret=$(awk -v time_tag="52=" -v start_time="54=" -v end_time="55=" '{p=index($0, time_tag)} {q=index($0, start_time)} {r=index($0, end_time)} /53=1/{print p,q,r}' "$i")
        read -r -a array <<< "$ret"
      done
    $ echo ${array[0]}
    1
    $ echo ${array[1]}
    14
    $ echo ${array[2]}
    22
    
    

    awk 부분은 결국 약간 변경되었습니다 :

    awk -v time_tag="52=" -v start_time="54=" -v end_time="55=" '{
        p=index($0, time_tag)
    } 
    {
        q=index($0, start_time)
    } 
    {
        r=index($0, end_time)
    } 
    /53=1/ {
        print p,q,r  # added this and the brackets around this
    }' $i
    
    

    이제 awk 출력 :

    1 14 22
    
    

    array 에 공간에 분할

      read 와 함께 .

    파일의 내용과 예상 출력 결과를 알지 못하면 더 이상 할 수 없습니다 (즉, awk로 다시 작성).

  • 답변 # 2

    질문이 약간 불분명하지만 원래 스크립트에서 다음 입력을 가정합니다

    52=abcd_53=1_54=efgh_55=ijkl
    
    

    다음 출력을 반환해야합니다 :

    52=abcd,54=efgh,55=ijkl
    
    

    이것이 당신의 궁극적 인 목표라면, 당신은 다음과 같은 일을 할 수 있습니다 :

    awk 'BEGIN{FS="[_=]";OFS=","}
         { for(i=1;i<NF;i+=2) a[$i]=$i"="$(i+1)
           if(a[53]==1) print a[52],a[54],a[55]
           delete a
         }' file
    
    

    물론 이것은 모든 라인이 다음과 같다고 가정합니다.

    bash 스크립트를 사용하여 이와 같은 것을 처리하려면 while 루프를 사용하여이 출력을 직접 처리 할 수 ​​있습니다

    awk '{...}' file | while IFS=, read -r time_tag start_time end_time; do
       do what you want to do
    done
    
    

    빠른 실행을 원하면 awk 로 모든 작업을 수행하십시오.  그리고 출력을 bash-loop로 파이프하십시오 :

관련 자료

  • 이전 docker-compose - 루트가 아닌 사용자가 사용할 수있는 tmpfs 마운트
  • 다음 asp.net - EF6에서 기존 마이그레이션 업데이트