이것은 무엇을 합니까?
( awk '{ if (NR > 1) print prev " " $1; prev = $1; }' file)
답변1
그것은 awk
스크립트입니다.awk는 프로그래밍 언어이다필드로 구분된 데이터를 처리하는 데 특히 좋습니다. 스크립트 자체는 매우 간단합니다.
if (NR > 1)
: 현재 입력 라인의 라인 번호를 보유하는NR
특수 변수입니다 .awk
따라서 이는 "현재 행 번호가 1보다 큰 경우", 즉 "첫 번째 행을 제외한 모든 행에 대해"를 의미합니다.print prev " " $1;
NR
: 와 같지만$1
줄의 첫 번째 필드를 보유하는 특수 변수이기도 합니다. 필드는 공백으로 정의되므로(기본적으로 를 사용하여 변경할 수 있음 ) , will be 및 will be 와-F
같은 줄이 제공됩니다 . 따라서 이는 변수 값 (다음 지점 참조), 공백( ), 현재 행의 첫 번째 필드를 인쇄합니다.foo bar
$1
foo
$2
bar
prev
" "
prev = $1;
: 이 줄의 첫 번째 필드를 변수에 저장합니다prev
. 따라서 다음 행을 처리할 때prev
이전 행의 첫 번째 필드를 갖게 됩니다.
그 기능을 확인하려면 테스트 입력에서 시도해 볼 수 있습니다. 예를 들어 seq 5
which를 사용하여 1부터 5까지의 숫자를 인쇄합니다.
$ seq 5
1
2
3
4
5
$ seq 5 | awk '{ if (NR > 1) print prev " " $1; prev = $1; }'
1 2
2 3
3 4
4 5
위에서 볼 수 있듯이 awk 스크립트는 이전 줄의 첫 번째 필드를 인쇄한 다음 현재 줄의 첫 번째 필드를 인쇄합니다.
답변2
입력 파일이 공백으로 구분된 파일이라고 가정합니다. 여기에 제공된 코드는 전체 파일을 읽고 한 줄의 첫 번째 열 값만 출력합니다.
예를 들면 input.txt
다음과 같습니다:-
AAA 4443
BBB 5595
CCC 4949
DDD 4434
스크립트 awk
는 다음을 출력합니다.
AAA BBB
BBB CCC
CCC DDD
DDD
첫 번째 행을 읽으면 첫 번째 행의 첫 번째 열인 AAA가 변수에 저장됩니다 prev
. 두 번째 행을 읽으면 prev의 값, 즉 가 인쇄되고 AAA
두 번째 행의 첫 번째 열이 인쇄되므로 가 됩니다 AAA BBB
. 이제 BBB
변수에 저장됩니다 prev
. 3행을 읽으면 인쇄됩니다 BBB CCC
. 4행을 읽으면 인쇄됩니다 CCC DDD
.