awk - 표준 입력에서 프로그램 및 입력을 읽으시겠습니까?

awk - 표준 입력에서 프로그램 및 입력을 읽으시겠습니까?

awk는 표준 입력에서 프로그램과 입력을 읽을 수 있습니까?

파일을 다음 함수로 파이프할 수 있기를 원합니다.

process_data () {
  awk -f - <<EOF
{print}
EOF
}

참고: 실제 프로그램은 더 길고 명령줄 인수로 전달할 수 없으며 임시 파일을 사용하고 싶지 않습니다.

현재는 아무것도 출력하지 않습니다.

$ yes | head | process_data 
$ 

답변1

process_data() {
  awk -f /dev/fd/3 3<< \EOF
  awk code here
EOF
}

명령줄 인수에는 개행 문자가 포함될 수 있으며 길이 제한이 있지만 일반적으로 수백 킬로바이트를 초과합니다.

awk '
  BEGIN {...}
  /.../ ...
  END {...}
'

문제가 awk스크립트에 작은따옴표 문자를 포함하는 것과 관련된 경우 다른 접근 방식은 코드를 변수에 저장하는 것입니다.

awk_code=$(cat << \EOF
{print "'quoted' " $0}
EOF
)

그리고 다음을 수행하십시오:

process_data() {
  awk "$awk_code"
}

답변2

프로그램을 받아야 하는 이유표준 입력? 'Bash를 사용하면 내용을 여러 줄로 나눌 수 있으므로 작은따옴표( )를 사용할 수 있습니다 .

# awk 'BEGIN { sum = 0 }
{ sum += $1 }
END { printf("sum = %d\n", sum) }' << EOF
1
2
3
EOF

관련 정보