아래와 같은 형식의 파일이 있습니다..
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
기본적으로 -E
xtended regex -n
ot는 줄을 인쇄하는 데 사용되며 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
숫자를 정렬 합니다.
-k
2