아아 아직 끝나지 않았어

아아 아직 끝나지 않았어

다음과 같은 파일에 다음 코드가 있습니다 awktest1.awk.

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"} employee.txt

여기에는 employee.txt다음 데이터가 포함됩니다.

100  Thomas  Manager    Sales  $5,000 
200  Jason   Developer  Technology  $5,500 
300  Sanjay  Sysadmin   Technology  $7,000 
400  Nisha   Manager    Marketing   $9,500 
500  Randy   DBA        Technology  $6,000

awk다음과 같이 명령을 실행합니다 .

awk -f awktest1.awk

하지만 인쇄만 되고 start끝나지 않습니다. 누구든지 내가 여기서 뭘 잘못하고 있는지 알아낼 수 있습니까?

답변1

오류는 처리할 파일 이름이 스크립트에 나와 있다는 것입니다. employee.txt스크립트에서 이를 제거하고 아래와 같이 실행 해야 합니다.

awk -f awktest1.awk employee.txt

또는 스크립트가 실행 가능한 경우에도

./awktest1.awk employee.txt

스크립트는

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"}

실제로 awk파일에서 읽는 것이 아니라 표준 입력의 입력을 기다리고 있습니다. 그렇기 때문에 끝이 없습니다...

답변2

보충하다@스티븐의 답변, 스크립트에서 입력 파일의 이름을 하드코딩하려면 다음과 같이 awk작성할 수 있습니다.

#!/bin/awk -f
BEGIN{
  ARGC=2
  ARGV[1] = "employee.txt"
  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}

여러 파일의 경우:

#!/bin/awk -f
BEGIN{
  ARGC=1
  ARGV[ARGC++] = "employee1.txt"
  ARGV[ARGC++] = "employee2.txt"
  ARGV[ARGC++] = "employee3.txt"
  # ...

  # or ARGC=1+split("employee1.txt employee2.txt employee3.txt", ARGV)

  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}

답변3

employee.txt또는 파일 이름을 명령줄 인수로 전달하지 않으려면 다음을 수행할 수 있습니다.

암호:

#!/bin/awk -f
BEGIN{
    print "start"
    while((getline <"employee.txt") > 0){
        {print $2, "\t", $5}
    }
    print "end"
} 

관련 정보