두 번째 열을 사용하고 정렬하여 파일에서 두 개의 열을 추출합니다.

두 번째 열을 사용하고 정렬하여 파일에서 두 개의 열을 추출합니다.

아래와 같은 형식의 파일이 있습니다..

ATOM    126  CD  GLN A 449      -2.853  11.592 119.709  1.00 17.95           C  
ATOM    127  OE1 GLN A 449      -4.056  11.297 119.695  1.00 20.83           O  
ATOM    128  NE2 GLN A 449      -1.948  10.876 120.359  1.00 14.98           N  
HETATM  129  N   MSE A 450      -4.523  16.830 119.280  1.00 14.88           N  
HETATM  130  CA  MSE A 450      -5.537  17.804 118.911  1.00 15.65           C  

파일에는 첫 번째 열에 다른 이름을 가진 수백 개의 행이 있습니다. ATOM이라는 행(첫 번째 열)과 ATOM의 11번째 열 값을 추출하고 싶습니다. 그런 다음 값을 정렬합니다(가장 작은 것부터 가장 큰 것까지). grep, awk, sed 등을 사용하여 이 작업을 수행하고 .txt 파일로 출력하려면 어떻게 해야 합니까?

답변1

awk '$1=="ATOM"{print $11}' file | sort -n > foo.txt

또는:

awk '$1=="ATOM"{print $1, $11}' file | sort -k2,2n > foo.txt

ATOM을 출력에 포함할지 여부에 따라 다릅니다.

답변2

이것이 확실히 좋은 방법이기는 하지만 awk중첩된 캡처 그룹을 사용하는 대안은 다음과 같습니다.

sed -En "s/^(^ATOM)(( +)([^ ]+)){10}.*/\1 \4/p" file | sort -n
ATOM 14.98
ATOM 17.95
ATOM 20.83

sed -En "s/(^ATOM)(( +)([^ ]+)){10}.*/\4/p" file | sort -n
14.98
17.95
20.83

송곳

sed기본적으로 -Extended regex -not는 줄을 인쇄하는 데 사용되며 s/대신 다음을 사용합니다.

  • \1첫 번째 캡처입니다 (^ATOM)( ^줄의 시작 부분에 고정되어 첫 번째 필드임).
  • \2{10}, 계속해서 반복합니다 (( +)([^ ]+)).
  • \3( +)본질적으로 반복적 이며
  • \4([^ ]+)동일한 반복(11번째 필드)에서 원하는 것 입니다 .
  • 마지막 것을 잡을 필요는 없습니다.*

그런 다음 캡처된 그룹의 출력이 다시 조립되거나 /\1 \4/맞춰 /\4/지고 p성공적으로 대체된 모든 라인이 인쇄됩니다.

답변3

문자열 조작을 사용하여 문자열에서 원하지 않는 공백을 제거할 수 있습니다. 그러면 사용 가능한 구분 기호 cut -d(공백 또는 탭) 가 남게 됩니다.

var="$(cat input.txt)"

echo "${var//+( )/$'\t'}" | cut -f1,11 | sort -nk2 > output.txt

//
+( )일치하는 공백
$'\t'탭 문자 의 모든 항목 바꾸기

cut -f출력 필드는 단어로 시작하는 1,11
sort -n숫자를 정렬 합니다.
-k2

관련 정보