Unix 명령을 해석하는 방법은 무엇입니까?

Unix 명령을 해석하는 방법은 무엇입니까?

다음과 같은 명령이 있습니다.

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

다음과 같이 같은 내용을 덜 관용적이면서도 더 명확하게 작성할 수 있습니다.

awk '{ 
        if(NR ==1 ){
            print
        } 
        else if ($NF < 0.05/1783){ 
            print 
        }
     }' PGC2.SCZ.1.dat

관련 정보