다음과 같은 awk 스크립트가 있습니다.
#!/bin/awk -f
BEGIN{}
{
for(i=1;i<=NF;i++)
sum+=$i; #sum of 3 numbers in a row
printf "Hello %d%s, %s %s, %d\n",NR,OFS, $1,$2,j;j=0
print > "hellofile1"
}
END{}
.awk 파일이 hellofile1에 다음과 같은 출력을 갖기를 원합니다.
1st field 2nd field
Hello 1 ... ...
Hello 2 ... ...
Hello 3 ... ...
하지만 다음과 같이 실행하면 awk -f hf.awk hello '>' 및 '>>' 오류가 발생합니다. PS print 명령 외부의 $1은 hello 파일을 매개변수로 참조합니다.
답변1
블록의 출력을 리디렉션할 수 없습니다 awk
.질문의 이전 버전). 또한 출력 파일의 이름을 큰따옴표로 묶어야 합니다.질문의 이전 버전). 비어 BEGIN
있고 END
블록을 완전히 제거할 수 있습니다.
Hello N
대신에 파일의 모든 줄 에 접두사를 붙이고 싶다면 N
현재 줄 번호에 해당하는 정수가 어디에 있습니까(정확히 당신이 하고 싶은 일이라고 추론할 수 있으며 코드는 이 글을 쓰는 동안 적어도 한 번은 거기에 있었습니다). 대답; 실제로 해야 할 일을 수행하기 위해 이것을 수정할 수 있습니다.
{
printf "Hello %d%s%s\n", NR, OFS, $0 >"hellofile1"
# or: print "Hello " NR, $0 >"hellofile1"
}
입력 파일의 각 행을 file 에 인쇄하고 hellofile1
문자열 Hello
, 행 번호 및 출력 필드 구분 기호(기본적으로 공백)가 앞에 붙습니다.
로 인해 출력 파일이 hellofile1
잘리지만 >
파일 awk
은 명시적으로 닫힐 때까지(여기에서는 발생하지 않음) 또는 프로그램이 종료될 때까지 쓰기용으로 열려 있으므로 프로그램의 모든 출력이 파일에 올바르게 인쇄됩니다(이후 print >
호출은 열린 파일에 추가됩니다).
이를 수행하는 또 다른 방법:
{
for (i = NF; i >= 1; --i)
$(i+1) = $i
$1 = sprintf("Hello %d", NR) # or: $1 = "Hello " NR
print >"hellofile1"
}
이렇게 하면 기존 필드가 한 필드 "오른쪽"으로 이동하고 Hello N
문자열이 레코드의 첫 번째 필드로 삽입됩니다. 그런 다음 레코드를 출력 파일에 인쇄합니다. 이렇게 하면 레코드가 다시 형성되고 OFS
출력에서 해당 필드가 구분됩니다(기본적으로 공백).
다음과 같이 사용할 수 있습니다.
$ awk -f script.awk myfile
그 중에는 myfile
입력으로 사용하려는 일부 파일이 있습니다.
답변2
$1
블록 내부의 다른 필드를 사용하는 것은 의미가 없으며 파일을 읽기 전에 실행되므로 필드가 정의되지 않습니다 BEGIN{}
. BEGIN
:
$ echo foo | awk 'BEGIN{print "The first field is:", $1}'
The first field is:
그리고 빈 블록은 의미가 없습니다 END{}
. 즉, 당신이 원하는 것은 이것이 전부라고 생각합니다.
awk '{print "Hello",NR,$0 > "outFile"}' inFile
또는 다른 옵션:
awk '{print "Hello",NR,$0}' inFile > outFile
다음과 같은 파일에 대해 위 명령을 실행하는 경우:
$ cat file
field1 field2
field1 field2
field1 field2
field1 field2
field1 field2
당신은 얻을 것이다:
$ awk '{print "Hello",NR,$0 > "outFile"}' file
$ cat outFile
Hello 1 field1 field2
Hello 2 field1 field2
Hello 3 field1 field2
Hello 4 field1 field2
Hello 5 field1 field2
awk 스크립트에서는 다음과 같습니다.
#!/bin/awk -f
{
print "Hello",NR,$0 > "outFile"
}
답변3
1,>그리고>>bash의 개념이지만 스크립트의 해석기는 /bin/awk입니다(스크립트의 첫 번째 줄에 따라). IMHO, bash 스크립트 내부에서 awk 스크립트를 호출해 보거나 HEREDOC을 사용하여 모든 것을 동일한 파일에 넣을 수 있습니다.
업데이트: bash/awk 문서 예제는 여기에 있습니다.여기