2017-11-20 13 views
1

이것은 내 첫 번째 질문이므로, 무엇이든 놓치면 알려주십시오.awk 배열은 인쇄 할 때 과도하게 표시됩니다.

이것은 배열을 사용하여 키 - 값 쌍을 만드는 awk 스크립트입니다.

헤더 정보가 콜론으로 구분 된 파일이 있습니다. 데이터는 그 아래에 있으며 콜론으로 구분됩니다. 필자의 목표는 새로운 파일을 인쇄하는 키 - 값 쌍을 만드는 것입니다. 나는 배열에 배치되도록 모든 것을 가지고 있고 거의을 완벽하게 출력합니다. 출력 여기서

#!/bin/awk -f 
BEGIN { 
    FS = ":" 
} 
{ 
    x = 1 
    if (NR==1) { 
     num_fields = NF ###This is done incase there are uneven head fields to data fields### 
     while (x <= num_fields) { 
      head[x] = $x 
      x++ 
     } 
    } 
    y = 2 
    while (y <= NR) { 
     if (NR==y) { 
      x = 1 
      while (x <= num_fields) { 
       data[x] = $x 
       x++ 
      } 
      x = 1 
      while (x <= num_fields) { 
       print head[x]"="data[x] 
       x++ 
      } 
     } 
     y++ 
    } 
} 
END { 
    print "This is the end of the arrays and the beginning of the test" 
    print head[16] 
    print "I am head[16]-"head[16]"- and now I'm going to overwrite everything" 
    print "I am data[16]-"data[16]"- and I will not overwrite everything, also there isn't any data in data[16]" 
} 

된다 :

... 
iscsi_name=iqn.1111-00.com.abc 
iscsi_alias=2222.blah01.blah01node00 
panel_name= 
enclosure_id=11BLAH00 
canister_id= 
=nclosure_serial_number ### Here is my issue ### 
This is the end of the arrays and the beginning of the test 
enclosure_serial_number 
- and now I'm going to overwrite everything 
I am data[16]-- and I will not overwrite everything, also there isn't any data in data[16] 

여기
...:iscsi_name:iscsi_alias:panel_name:enclosure_id:canister_id:enclosure_serial_number 
...:iqn.1111-00.com.abc:2222.blah01.blah01node00::11BLAH00::: 

코드이다 : 여기

는 입력 참고 : 데이터 [16]이 줄 끝 부분에 없기 때문에 데이터 라인에 여분의 콜론이 있으므로 위의 num_fields 노트

왜 헤드 [16]가 자신을 덮어 쓰 시나요? 필드 끝에 줄 바꿈 (\ n)이 있습니까? 그렇다면 어떻게 제거 할 수 있습니까? 나는 마지막 문자를 뺀 것을 더해 보려고 노력했다. 배열이 그 필드에서 사용할 수있는 문자의 수를 제한하려고 시도했지만 행운이 없습니다. 나는 더 많은 아이디어와 운을 시험했다. 전체 공개 : 나는이 모든 것에 비교적 새로운 것이므로 이전 수정본을 엉망으로 만들었을 것입니다!

왜 이런 일이 발생했는지에 대한 아이디어가 있습니까? 감사합니다. -cheezter88

+1

TL; DR하지만, 제목하지만 윈도우 타입 줄 끝은 ('\ r \ n'과 단지'\ n', awk에서'dos2unix' 또는'sub (/ \ r /, "", $ NF)'를 사용하는 원인이 될 수 있습니다. –

+0

BTW, 귀하의 스크립트는 마지막 두 번의 인쇄 호출에서 작은 따옴표를 사용합니다. – thanasisp

+0

아래에 의견을 게시 한 후 이것을 보았습니다. 감사합니다! 모든 것을 Linux로 이전. 나는 문자 그대로 책상을 상대로 머리를 치고 있었고 그것은 단지 어리석은 창이다. –

답변

0

스크립트가 불필요하게 복잡합니다. 첫 번째 행으로 레코드 크기를 조정하려면 그렇게하십시오.

(나는 대체 "..."접두사를 "X"로) 당신이 기록의 나머지 부분에 대해이 작업을 수행하려면

awk -F: 'NR==1 {n=split($0,h); next} # populate header fields and record size 
     NR==2 {for(i=1;i<=n;i++)  # do the assignment up to header size 
        print h[i]"="$i}' file 

x=x 
iscsi_name=iqn.1111-00.com.abc 
iscsi_alias=2222.blah01.blah01node00 
panel_name= 
enclosure_id=11BLAH00 
canister_id= 
enclosure_serial_number= 

이의 NR==2 조건을 제거

+0

빠른 답장을 보내 주셔서 감사합니다! 또한이 코드의 훨씬 간결한 버전을 보여 주셔서 감사합니다. 이것은 훨씬 덜 복잡하며 움직이는 부분이 훨씬 적습니다. 나는 배열 뒤의 모든 것이 복사되는 마지막 줄에 여전히 문제가있다. 나는 그것이 내 시스템과 관련이 있다고 생각하기 시작했다. Windows에서 Cygwin64 Terminal을 실행하고 있는데, 내가 말하고있는 문제를 일으킬 수 있습니까? –

+0

Nevermind, James Brown이 질문에 답변했습니다. 귀하의 도움과 빠른 답변에 모두 감사드립니다! –