이 명령이 무엇을 의미하는지 설명해 주시겠어요?
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
에서 읽고 존재하는 첫 번째 열만 인쇄합니다. 이 파일의 행은 첫 번째 열에 있습니다. 파일의 .somefilename
somefilename
list
"긴 형식"으로 작성된 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
출력의 일부가 됩니다. 어떤 열이 필요한지 알고 있는 경우 -o
for 플래그를 사용하여 이 문제를 해결할 수 있습니다 join
.
$1
스크립트의 두 위치를 $0
(첫 번째 열 대신 전체 행) 로 변경하면 awk
스크립트가 다음과 동일 해집니다.
grep -Fx -f list somefilename
여기서 파일은 패턴 목록( ) list
으로 사용되며 , 이는 고정 문자열( ), 전체 줄( ) , .grep
-f list
-F
-x
somefilename
somefilename
답변2
이름이 너무 많으면 혼란이 생길 수 있습니다 list
. 아마도 이렇게 하면 상황이 더 명확해질 것입니다.
awk 'BEGIN { while( getline < "filename" ) myarray[$1] }'
myarray
이렇게 하면 파일의 각 줄에 있는 첫 번째 필드로 배열이 채워집니다 filename
.
매뉴얼 awk
:
"Function" [..]
getline <file
$0을 의 다음 레코드로 설정합니다file
.