![for 루프는 여러 작업을 완료할 수 있습니다](https://linux55.com/image/34031/for%20%EB%A3%A8%ED%94%84%EB%8A%94%20%EC%97%AC%EB%9F%AC%20%EC%9E%91%EC%97%85%EC%9D%84%20%EC%99%84%EB%A3%8C%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
이 코드의 출력은 두 개의 txt 파일입니다. 둘 다에 대해 for 루프를 만들 수 있나요? 즉, for 루프는 두 개 이상의 출력을 제공합니까? ID1과 ID2에는 파일 이름이 있습니다. ID1과 ID2에 있는 각 항목의 첫 번째 줄을 인쇄하고 이를 출력1과 출력2로 저장하고 싶지만 두 개의 for 루프를 사용하고 싶지 않습니다. 내가 찾고 있는 것은 작업을 수행하는 for 루프입니다.
#!/bin/bash
in=/a/b/c
li=/a/b/c/d/
g1=/a/s/t1/1.txt
g2=/a/s/t2/2.txt
for i in $(cat $li/ID1.txt); do
sed '1q;d' ${in}/${i}/${g1};
done > output1.txt
for i in $(cat $li/ID2.txt); do
sed '1q;d' ${in}/${i}/${g2};
done > output2.txt
답변1
좋아요, 이제 변수의 경로 이름이 무엇인지 이해한 것 같습니다.
for n in 1 2; do n=$n.txt
for f in $(cat "$li/ID$n")
do IFS= read -r l <"$in/$f/a/s/t${n%.*}/$n"
printf %s\\n "$l"
done > "output$n"; done
나생각하다이것은 당신이 추구하는 것을 달성할 것입니다. 그렇다면 모든 것, 즉 cat
.
말하자면, 여기와 같이 분할할 때 cat
값을 명확하게 하고 확장자에서 파일 이름 전역을 해석하지 않는 것이 중요합니다. 해당 파일의 내용을 모르기 때문에 더 이상의 제안을 드릴 수 없습니다.$IFS
for ... in $(cmd sub)
$IFS
set -f
또 다른 접근 방식은 빈 문자열 구분 기호를 포함할 수 있습니다. 조각화 에 많이 의존합니다 $IFS
. 확장에 따라 다릅니다.아니요빈 문자열을 마커로 사용하므로 빈 문자열을 포함합니다. 이를 변경하지 않고 $IFS
기본값으로 설정하면 $(cat file)
확장에 빈 문자열이 포함되지 않습니다. 다음과 같이 보일 수 있습니다:
io=/a/s/t1/1.txt
for f in $(cat "$li/ID1.txt") '' $(cat "$li/ID2.txt")
do [ -z "$f" ] && io=/a/s/t2/2.txt && continue
IFS= read -r l <"$in/$f/$io"
printf %s\\n "$l" >> "output${io##*/}"
done
아니면 그렇게 할 수도 있습니다...
n=0
for f in '' $(cat "$li/ID1.txt") '' $(cat "$li/ID2.txt")
do [ -z "$f" ] && exec >"output$((n+=1)).txt" && continue
IFS= read -r l <"$in/$f/a/s/t$n/$n.txt"
printf %s\\n "$l"
done
답변2
이 특별한 경우에는 루프가 전혀 필요하지 않습니다.
#!/usr/bin/env bash
in=/a/b/c
li=/a/b/c/d/
g1=/a/s/t1/1.txt
g2=/a/s/t2/2.txt
files1=$(sed "s#^#${in}/#;s#\$#/${g1}#" $li/ID1.txt | tr '\n' ' ')
files2=$(sed "s#^#${in}/#;s#\$#/${g2}#" $li/ID2.txt | tr '\n' ' ')
head -qn 1 $files1 > output1
head -qn 1 $files2 > output2
각 줄의 시작과 끝 부분 에 files1=...
추가하는 데 사용됩니다 . 그러면 대상 파일 이름 목록이 생성됩니다. 그런 다음 모든 항목을 전달하여 첫 번째 줄을 인쇄할 수 있습니다.sed
$in
$g1
sed
중요한: 이것은 파일 이름이 정상이라고 가정합니다(공백, 개행 또는 기타 이상한 문자를 포함하지 않음). 그렇지 않은 경우 알려주시면 보다 확실한 답변을 드릴 수 있도록 노력하겠습니다. 공백이 있는 파일 이름의 경우 원래 for
반복 방법도 실패합니다.
일반적으로 어떤 언어를 사용하든 반복적인 코드를 작성하는 경우 함수 사용을 고려해야 합니다.
#!/usr/bin/env bash
in=/a/b/c
li=/a/b/c/d/
g1=/a/s/t1/1.txt
g2=/a/s/t2/2.txt
firstline(){
_in="$1"
_g="$2"
file="$3"
while read i
do
sed '1q;d' ${in}/${i}/${g}
done < "$file"
}
firstline "$li/ID1.txt" "$in" "$g1" > output1.txt
firstline "$li/ID2.txt" "$in" "$g2" > output2.txt