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
).
- 읽다데이터에서
text.txt
. - 읽다경로명에서
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
유틸리티 실행을 중지합니다 . 이것은 비표준 옵션이므로 설명서를 확인하십시오.gawk
if
xargs
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