for 루프는 여러 작업을 완료할 수 있습니다

for 루프는 여러 작업을 완료할 수 있습니다

이 코드의 출력은 두 개의 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값을 명확하게 하고 확장자에서 파일 이름 전역을 해석하지 않는 것이 중요합니다. 해당 파일의 내용을 모르기 때문에 더 이상의 제안을 드릴 수 없습니다.$IFSfor ... in $(cmd sub)$IFSset -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$g1sed

중요한: 이것은 파일 이름이 정상이라고 가정합니다(공백, 개행 또는 기타 이상한 문자를 포함하지 않음). 그렇지 않은 경우 알려주시면 보다 확실한 답변을 드릴 수 있도록 노력하겠습니다. 공백이 있는 파일 이름의 경우 원래 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

관련 정보