이 awk 명령은 무엇을 의미합니까? [폐쇄]

이 awk 명령은 무엇을 의미합니까? [폐쇄]

이 명령이 무엇을 의미하는지 설명해 주시겠어요?

awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list'

답변1

주문하다

awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list' somefilename

이는 다음과 같습니다.

awk 'BEGIN {while (getline < "list") array[$1]} $1 in array' somefilename

(여기서는 변수의 이름을 변경 list하고 array중복 항목을 제거했습니다 ;.) 먼저 이름이 지정된 파일에서 읽은 다음 (또는 제공되지 않은 경우 표준 입력 ) list에서 읽고 존재하는 첫 번째 열만 인쇄합니다. 이 파일의 행은 첫 번째 열에 있습니다. 파일의 .somefilenamesomefilenamelist

"긴 형식"으로 작성된 awk스크립트는 다음과 같이 작성할 수 있습니다.

#!/usr/bin/awk -f

# This block runs before processing input data.
BEGIN {
    # Read "list" line by line.
    while (getline <"list")
        array[$1] = 1  # Make an entry in the associative array
                       # with the first column as key.
}

# This block processes data.
# If the first column of the data is a key in the array, print the whole line.
$1 in array { print } 

간단히 말해서 이는 두 파일 사이의 첫 번째 열에 대한 원시 JOIN 작업으로, 파일을 정렬할 필요가 없습니다(정렬 순서가 유지됨 somefilename). 결과는 somefilename첫 번째 열이 의 첫 번째 열 중 하나와 일치하는 행이 됩니다 list.

순서를 (거의) 보존하지 않는 또 다른 방법은 다음과 같습니다.

join <( sort list ) <( sort somefilename )

결과는 다르게 정렬되며 의 모든 열은 list출력의 일부가 됩니다. 어떤 열이 필요한지 알고 있는 경우 -ofor 플래그를 사용하여 이 문제를 해결할 수 있습니다 join.


$1스크립트의 두 위치를 $0(첫 번째 열 대신 전체 행) 로 변경하면 awk스크립트가 다음과 동일 해집니다.

grep -Fx -f list somefilename

여기서 파일은 패턴 목록( ) list으로 사용되며 , 이는 고정 문자열( ), 전체 줄( ) , .grep-f list-F-xsomefilenamesomefilename

답변2

이름이 너무 많으면 혼란이 생길 ​​수 있습니다 list. 아마도 이렇게 하면 상황이 더 명확해질 것입니다.

awk 'BEGIN { while( getline < "filename" ) myarray[$1] }'

myarray이렇게 하면 파일의 각 줄에 있는 첫 번째 필드로 배열이 채워집니다 filename.

매뉴얼 awk:

"Function" [..] getline <file$0을 의 다음 레코드로 설정합니다 file.

관련 정보