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

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

 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

그러면 두 번째 열의 값을 어떻게 얻습니까? (제 경우에는 1 개의 열이있는 405 개의 값에 해당하는 405 개의 행이 있습니다.)

댓글

  • 헤더가 고정 길이 인 경우 제거 할 수 있습니다. tail 만 있고 다른 열에 대해서는 awk가 있습니다. ' 코드 들여 쓰기에주의를 기울일 것을 제안합니다. 들여 쓰기와 중괄호가 일치하지 않기 때문에 질문의 스 니펫을 해석하기가 매우 어렵습니다.

답변

첫 번째 열의 숫자를 확인하기에 충분하다고 가정하면 :

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" } 

댓글

  • 주의 사항 명령 출력에는 3G와 같은 항목을 포함 할 수있는 헤더 (질문 개정 참조)가 있습니다. 이러한 값을 필터링하려면 정규식이 더 엄격해야합니다.
  • @sjsam Not 아주 나는 수정본을 살펴보고있는 나 자신을 확인했지만 ' 그럼에도 불구하고 답변을 업데이트했습니다 (당신과 다른 방식으로 Stephen ' s).

답변

테스트 할 수 있습니다. 첫 번째 필드가 숫자로 시작하는지 확인하고 두 번째 필드 만 인쇄합니다.

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 .... 

댓글

  • [0-9]+ coz first column is always a number? 또한 입력은 명령에서 나왔으므로 파이프로 처리해야합니다.
  • 모든 버전의 awk+ 구문. 질문은 데이터가 electric_thermal.dat
  • 에서 왔다고 말했습니다.

  • 흠, 스크립트의 주석을 간과했습니다. 감사. +와 관련하여 gnu/non-gnu awks 어떤 버전을 의미 했습니까?
  • 오래된 오래된 시스템과 함께 사용하는 데 문제가 없었습니다. 🙂

Answer

awk는 친구입니다.

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

해야 함

답변

명령

 awk "$1 ~ /^[0-9]*$/{print $2}" file name output 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 

Answer

명령을 실행 한 후에도 위의 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 

댓글

  • 비 공감 : 쓸모없는 [ cat 사용 ] , 솔루션이 ' 만족하지 않습니다. y 요구 사항. 또한 코드 형식을 지정하십시오.

답변

시도 :

awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile 

설명

  • 코드 블록 사용 방법을 알아보세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다