표준 입력이나 파일의 입력을 받아들이는 스크립트를 작성하는 방법은 무엇입니까?

표준 입력이나 파일의 입력을 받아들이는 스크립트를 작성하는 방법은 무엇입니까?

cat text.txt | driver.sh여러 파일의 입력을 허용하는 awk 스크립트용 bash 드라이버가 있습니다 . ./driver.sh file1.txt file2.txt ... [filen.txt]나는 사용해 보았습니다.

   read var
   gawk -f awk_prac.awk $var

이는 파이프에만 적용됩니다. 또한 for 루프를 사용하여 모든 파일 이름을 읽으려고 시도했지만 파이프된 텍스트에서는 작동하지 않습니다. 어떤 의견이라도 감사하겠습니다.

답변1

수행하려는 작업 에 따라 두 가지 솔루션이 있습니다 cat text.txt | driver.sh(그런데 로 작성하는 것이 더 좋습니다 driver.sh <text.txt).

  1. 읽다데이터에서 text.txt.
  2. 읽다경로명에서 text.txt.

목록이 비어 있으면 "드라이버"(실제로는 래퍼) 스크립트를 /dev/stdin위치 매개변수 목록에 추가할 수 있습니다.

#!/bin/sh

if [ "$#" -eq 0 ]; then
    set -- /dev/stdin
fi

gawk -f awk_prac.awk "$@"

인수 없이 래퍼 스크립트를 호출하면 awk스크립트가 표준 입력 스트림에서 입력을 가져옵니다.

인용문을 참고하세요 "$@". 이는 개별적으로 인용된 각 위치 인수(셸 스크립트 인수)로 확장됩니다. 즉, 이름에 공백 및/또는 셸 와일드카드가 포함된 파일 이름에 적용됩니다.

awk코드에서 예상하는 경우하나의매번 파일을 호출한 다음 루프를 사용합니다.

#!/bin/sh

if [ "$#" -eq 0 ]; then
    set -- /dev/stdin
fi

for pathname do
    gawk -f awk_prac.awk "$pathname"
done

표준 입력으로 읽는다는 것은 읽고 싶다는 뜻입니다.경로명처리할 데이터가 아닌 표준 입력에서 다음을 사용할 수 있습니다 xargs(경로 이름 수가 awk스크립트 호출을 위해 생성된 명령줄의 최대 길이를 초과할 수 있으므로).

#!/bin/sh

if [ "$#" -eq 0 ]; then
    cat
else
    printf '%s\n' "$@"
fi | xargs -r gawk -f awk_prac.awk

스크립트에 인수가 제공되지 않으면 표준 입력(음, 를 통해)에서 직접 경로 이름을 cat전달 합니다. xargs인수가 있는 경우 처리를 위해 개행으로 구분된 목록으로 인쇄됩니다 xargs. 다시 말하지만, 인용은 "$@"필수적입니다.

-r이 옵션은 복합 명령문에 해당 데이터가 없는 경우 xargs유틸리티 실행을 중지합니다 . 이것은 비표준 옵션이므로 설명서를 확인하십시오.gawkifxargs

awk코드에서 예상하는 경우하나의각 호출은 파일을 생성한 xargs다음 -L 1.

답변2

1 파일에서 가져오기

파일에서 작동하기 위해 파일 이름을 읽는 작은 스크립트를 작성할 수 있습니다.

샘플 파일

$ cat /tmp/files.txt
one.txt
two.txt
three.txt

스크립트

while read -r fileName; do 
    gawk -f awk_prac.awk $fileName; 
done < /tmp/files.txt

산출:

one.txt
two.txt
three.txt

2 표준 입력으로부터의 입력

마찬가지로 stdin에서도 입력을 얻을 수 있습니다. 한 줄에 하나의 파일 이름을 제공하거나 한 줄에 모든 파일 이름을 제공하고 그에 따라 스크립트를 작성할 수 있습니다.

답변3

스크립트 파일드라이버.sh

#!/usr/bin/bash

for argument do
gawk -f awk_prac.awk "$argument";
done

구현하다(여러 파일을 제공할 수 있습니다):

$./driver.sh file1.txt file2.txt ... [filen.txt]

파일명이 주어지면표준 입력, for 루프를 사용하여 각 파일을 실행할 수 있습니다.

while read -p "Enter File name : " file
do
gawk -f awk_prac.awk $file
echo "Press Ctrl+C to quit"
done

실행: 그냥

$./driver.sh

관련 정보