다음과 같은 명령이 있습니다.
cat PGC2.SCZ.1.dat | awk 'NR == 1 || $NF < 0.05/1783'
그래서 이 부분은 첫 번째 줄을 건너뛰는 것을 의미한다고 생각합니다.
awk 'NR == 1
그런데 이것이 무엇을 의미하는가?
|| $NF < 0.05/1783'
감사해요
답변1
NR
로 스트리밍된 행을 참조하여 "레코드 수"를 나타냅니다 awk
. (기본적으로 공백이 아닌 새 줄은 새 레코드입니다. 다른 레코드 구분 기호를 정의할 수 있습니다 RS
. 그러면 여기서 용어 line
는 더 이상 정확하지 않습니다.)
NF
"필드 수"를 의미하며 행의 열 수를 나타냅니다. $
이전 이유 때문에 NF
마지막 열의 값을 요청합니다. (참고: 기본적으로 공백이나 탭 문자는 필드 구분 기호라고도 하는 열 구분 기호로 사용됩니다 FS
.)
"또는" 이라는 뜻입니다 ||
.
PGC2.SCZ.1.dat
요약하면, 명령은 첫 번째 행과 마지막 열에서 0.05/1783보다 작은 값을 가진 모든 행을 인쇄합니다 .
답변2
첫째, *nix를 배우고 있으므로 이것은 "useless use of cat"(*nix 세계의 유명한 비유)의 예입니다. 여기서는 필요하지 않습니다 . cat file | awk command
이렇게 하면 됩니다 awk command file
.
어쨌든 awk를 계속 사용하세요. awk의 표현식이 true로 평가되면 기본 작업은 현재 줄을 인쇄하는 것입니다. NR
현재 줄 번호이므로 NR == 1
파일의 첫 번째 줄에도 적용됩니다. 그런 다음 awk는 입력을 빈 필드(또는 -F
해당 옵션을 사용하여 선택한 다른 필드)로 나눕니다. 그런 다음 이러한 필드를 변수 $1
, $2
, ... 로 사용할 수 있습니다. $NF
여기서 NF
는 필드 수입니다. 따라서 $NF
마지막 필드의 내용입니다.
awk 'NR == 1 || $NF < 0.05/1783'
이를 모두 종합하면 첫 번째 행과 마지막 필드가 나누기보다 작은 다른 모든 행에서 표현식이 true가 됩니다.0.05
1783
다음과 같이 같은 내용을 덜 관용적이면서도 더 명확하게 작성할 수 있습니다.
awk '{
if(NR ==1 ){
print
}
else if ($NF < 0.05/1783){
print
}
}' PGC2.SCZ.1.dat