awk 스크립트를 사용하여 다른 파일에 정보 쓰기

awk 스크립트를 사용하여 다른 파일에 정보 쓰기

다음과 같은 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 문서 예제는 여기에 있습니다.여기

관련 정보