명령 출력에서 ​​두 번째 열을 얻는 방법은 무엇입니까?

명령 출력에서 ​​두 번째 열을 얻는 방법은 무엇입니까?

내 명령의 출력은 다음과 같습니다.

                                   N O D E   O U T P U T

THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT

   NODE FOOT-   NT11     
        NOTE

      3       20.00     
     11       20.00     
   1003       23.75     
   1011       23.75     
   2003       27.52     
   2011       27.52     
   3003       31.30     
   3011       31.30     
   4003       35.08     
   4011       35.08     
   5003       38.87     
   5011       38.87     
   6003       42.67     
   6011       42.67     
   7003       46.48     
   7011       46.48     
   8003       50.29     
   8011       50.29     
   9003       54.12     
   9011       54.12     
  10003       57.95     
  10011       57.95     
  11003       61.79     
  11011       61.79     
  12003       65.64     
  12011       65.64     
  13003       69.50     
  13011       69.50     
  14003       73.37     
  14011       73.37     
  15003       77.25     
  15011       77.25     
  16003       81.14

첫 번째 열은 항상 숫자입니다. 제 의도는 두 번째 열만 가져오는 것입니다. 예를 들면 다음과 같습니다.

20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
.
.

나는 사용할 계획이다

# gawk -f nset_output.awk electric_thermal.dat
BEGIN{
}
{
               if($12~/NSET_OUTPUT/ ){
                   for(i=1;i <= 5; i++){
                       getline
                   }
                   x=$2

        print x >"nset_output.dat"

    }       

}

그러나 이를 수행하기 위해 출력이 엉망이 됩니다. (하나의 값만 20.00) 20.00

그렇다면 두 번째 열의 값을 얻는 방법은 무엇입니까? (제 경우에는 405개 값의 1열에 해당하는 405개의 행이 있습니다)

답변1

첫 번째 열의 숫자를 확인하는 것으로 충분하다고 가정합니다.

awk '$1 ~ /[0-9]/ { print $2 }' data.in >data.out

이것이 이 줄 이후의 줄에만 적용되도록 하려면 NSET_OUTPUT다음과 같이 할 수 있습니다:

sed '1,/NSET_OUTPUT/d' data.in | awk '$1 ~ /[0-9]/ { print $2 }' >data.out

그러면 이전 줄이 삭제 NSET_OUTPUT되고 나머지 줄이 awk스크립트로 전송됩니다.


스크립트는 숫자만 출력합니다.각 입력 라인에 대해는 을 찾고 NSET_OUTPUT, 발견되면 두 번째 열에서 숫자를 가져오기 전에 5개 행을 건너뜁니다.

다음은 수정된 버전입니다.당신의스크립트:

BEGIN { print_values = 0 }

$12 ~ /NSET_OUTPUT/ {
    for (i = 1; i <= 5; i++) {
        getline;
    }

    print_values = 1;
}

print_values == 1 {
    x = $2;
    print x >"nset_output.dat"
}

답변2

첫 번째 필드가 숫자로 시작하는지 테스트한 다음 두 번째 필드를 인쇄할 수 있습니다.

awk '$1 ~ /^[0-9][0-9]*$/ { print $2}' electric_thermal.dat > nset_output.dat

이는 소스 파일과 일치하고 반환됩니다.

20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
....

답변3

awk당신의 친구입니다:

awk '$1 ~ /^[[:digit:]]+$/{print $2}' electric_thermal.dat >outfile

이렇게 해야 해

답변4

각 명령 실행 후에도 위의 7개 라인이 여전히 존재하는 경우 다음을 사용하십시오.

yourcommand | sed 1,7d | awk '{print $2}'

sed 1,7d필요하지 않은 처음 7개 행을 숨길 뿐입니다. awk당신이 정말로 찾고 있는 것이 무엇인지 정확하게 정리해줄 것입니다.

cat yourcommand_out | sed 1,7d | awk '{print $2}'
20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
35.08
35.08
38.87
38.87
42.67
42.67
46.48
46.48
50.29
50.29
54.12
54.12
57.95
57.95
61.79
61.79
65.64
65.64
69.50
69.50
73.37
73.37
77.25
77.25
81.14

관련 정보