여기에 게시된 솔루션 중 일부를 시도했지만 아무 소용이 없습니다. 나는 이것이 당신이 쉽게 발견할 수 있고 내가 얼굴을 손바닥으로 대할 수 있는 내가 놓친 어리석고 명백한 일이기를 바랍니다.
데이터 분석을 위한 여러 명령이 포함된 bash 스크립트가 있습니다. 명령줄에서 이 스크립트를 실행하면 다음과 같이 표시됩니다(단순화).
./script.sh /path/to/file1.gz /path/to/file2.gz output_name
script.sh
처음 두 매개변수는 데이터 분석 명령에 필요한 파일의 경로입니다. 예상 한 대로 output_name
는 마지막 출력 파일의 이름입니다.
이것은 잘 작동하지만 각각 새 줄에 여러 파일 경로가 있는 파일을 갖고 파일의 각 줄을 반복하고 스크립트를 순서대로 실행하고 싶습니다. 따라서 매개변수 파일은 다음과 같습니다.
/path/to/file1.gz /path/to/file2.gz output_name1
모든 라인에.
그런 다음 while 루프를 통해 각 줄을 스크립트에 입력합니다(이것이 최고라고 생각합니다).
나는 시도했다:
while read -r line; do; ./script.sh; done < arg_list.txt
arg_list.txt가 입력 인수 목록을 포함하는 파일인 경우 "파일을 열 수 없습니다."라는 메시지가 표시됩니다.
내가 멍청하고 뭔가 빠졌다고 자유롭게 말해 주세요!
답변1
자신만의 구조를 사용하여 한 줄에 공백으로 구분된 세 개의 값을 읽고 이를 스크립트의 인수로 사용합니다.
while read -r in1 in2 out
do
./script.sh "$in1" "$in2" "$out"
done < arg_list.txt
답변2
입력 파일의 내용이 올바르게 인용되었다고 가정하면(인수에 공백, 탭 또는 줄 바꿈이 포함된 경우) xargs
다음과 같이 사용할 수 있습니다.
xargs -n 3 ./script.sh <arg_list.txt
이번에는 입력에서 세 개의 매개변수를 읽고 이를 사용하여 스크립트를 호출합니다.
세 개의 매개변수 세트는 입력 파일의 같은 줄에 나열될 필요가 없습니다. xargs
세 개의 매개변수는 같은 줄에 있는지 또는 2~3줄에 걸쳐 있는지 여부에 관계없이 읽고 스크립트를 호출하는 데 사용됩니다.
예( printf
스크립트 대신 명령 사용):
$ cat file
/path/to/file1.gz /path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
'/path/to/file 1.gz' /path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
/path/to/file1.gz
/path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
$ xargs -n 3 printf 'Arg1: "%s", Arg2: "%s", Arg3: "%s"\n' <file
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file 1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
답변3
실제로 파일에 정확한 매개변수 목록이 포함되어 있으면 루프가 매우 단순해집니다.
while read
do
./script.sh $REPLY
done
이 REPLY
변수는 자동 변수이며 지정하지 않으면 행을 필드로 분할하지 않으므로 그대로 사용할 수 있습니다 read
. REPLY
이 경우에는 따옴표가 없습니다. 파일에서 읽은 줄에 공백과 따옴표가 포함되어 있으면 파일에 있는 그대로 정확하게 명령으로 전송됩니다. 따라서 파일에 한 줄이 있으면 세 개의 매개변수와 마지막 매개변수에 공백이 a b "c d"
있는 스크립트를 호출하게 됩니다 . script.sh a b "c d"
따라서 파일 내에서 올바르게 참조되는지 확인해야 합니다.
파일에서 읽은 매개변수를 어떤 방식으로든 업데이트해야 하는 경우 더 자세한 작업을 수행할 수 있습니다 read
.
while read f1 f2 f3
do
./script.sh "$f2" "$f1" "$f3.txt"
done
이 경우 파일의 참조 내용에도 주의하세요. 동일한 행에 대해 a b "c d"
이 코드는 script.sh b a "c d".txt
정확히 원하는 결과가 아닐 수도 있습니다.
매개변수가 있는 파일에 특이한 내용으로 구분된 필드가 포함되어 있는 경우 IFS
먼저 특수 변수를 수정할 수 있습니다 read
. read
그런 다음 행은 해당 값으로 분할됩니다 IFS
.
좀 더 복잡한 것이 필요한 경우에는 또는 또는 같은 전체 언어를 사용할 수도 xargs
있습니다 . 많은 솔루션이 있습니다.awk
perl
python