저는 bash의 초보자이고 문구 목록을 반복하려고 합니다. 제 목표는 다음과 같습니다.
A) 다음을 .
사용하여 각 구문을 분할합니다.
B) 원래 문구도 사용할 수 있습니다.
내 의사 코드/시도는 다음과 같습니다 -
while read x
do
eval "whole_phrase=$x" # store the whole phrase to another variable
eval "first_element=echo $x | cut -d';' -f1" # extract the first element after splitting
myprogram -i ../$first_element -o ../$whole_phrase
done < ListOfDotSeparatedPhrases.txt
ListOfDotSeparatedPhrases.txt
그것은 다음과 같습니다 -
18T3L.fastqAligned.sortedByCoord.out.bam
35T10R.fastqAligned.sortedByCoord.out.bam
18T6L.fastqAligned.sortedByCoord.out.bam
40T4LAligned.sortedByCoord.out.bam
22T10L.fastqAligned.sortedByCoord.out.bam
38T7L.fastqAligned.sortedByCoord.out.bam
나는 이것을 수행하는 가장 좋은 방법을 웹에서 검색하려고 노력했지만 실패했습니다. 어떤 아이디어가 있나요? 나는 이것이 실제로 별로 어렵지 않다고 믿는다!
답변1
read
분할을 해보겠습니다. 필드 구분자를 설정하는 것은 어떻습니까 .
?
while IFS=. read -r first_element remainder; do
echo myprogram -i "../$first_element" -o "../${first_element}.${remainder}"
done < ListOfDotSeparatedPhrases.txt
myprogram -i ../18T3L -o ../18T3L.fastqAligned.sortedByCoord.out.bam
myprogram -i ../35T10R -o ../35T10R.fastqAligned.sortedByCoord.out.bam
myprogram -i ../18T6L -o ../18T6L.fastqAligned.sortedByCoord.out.bam
myprogram -i ../40T4LAligned -o ../40T4LAligned.sortedByCoord.out.bam
myprogram -i ../22T10L -o ../22T10L.fastqAligned.sortedByCoord.out.bam
myprogram -i ../38T7L -o ../38T7L.fastqAligned.sortedByCoord.out.bam
에서 man bash
:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p
prompt] [-t timeout] [-u fd] [name ...]
One line is read from the standard input, or from the file
descriptor fd supplied as an argument to the -u option, split
into words as described above under Word Splitting, and the
first word is assigned to the first name, the second word to the
second name, and so on. If there are more words than names, the
remaining words and their intervening delimiters are assigned to
the last name. If there are fewer words read from the input
stream than names, the remaining names are assigned empty val‐
ues. The characters in IFS are used to split the line into
words using the same rules the shell uses for expansion
(described above under Word Splitting).
또는 (실제로 이것이 더 간단하고 이식성이 더 좋습니다) 전체 줄을 읽고 유지한 다음 쉘 인수 확장을 사용하여 나머지를 제거하여 첫 번째 요소를 생성합니다.
while read -r x; do
myprogram -i "../${x%%.*}" -o "../$x"
done < ListOfDotSeparatedPhrases.txt
답변2
반면:
eval "whole_phrase=$x" # store the whole phrase to another variable
더 좋은 점은 다음과 같습니다.
whole_phrase="$x"
그리고 다음을 제공합니다:
eval "first_element=echo $x | cut -d';' -f1" # extract the first element after splitting
첫 번째 요소를 추출하는 방법에는 여러 가지가 있습니다.
구분 기호는 마침표 또는 이므로 .
이를 에 전달 awk
하고 첫 번째 필드만 인쇄하도록 요청합니다.
first_element="$(awk -F. '{print $1}' <<< "$x")"
또는 이 특별한 경우에는 첫 번째 요소만 필요하므로 sed
첫 번째 .
문자와 그 뒤의 모든 항목을 쉽게 제거할 수 있습니다.
first_element="$(sed -e 's/\..*//' <<< "$x")"
x
마지막으로, 파일에서 읽은 변수를 변경하지 않는 한 이미 whole_phrase
값을 갖고 있다는 점을 고려하세요. 실제로 루프에서 이 변수 이름을 사용할 수 있습니다 while
.
while read whole_phrase
do
first_element="$(awk -F. '{print $1}' <<< "$whole_phrase")"
myprogram -i "../$first_element" -o "../$whole_phrase"
done < ListOfDotSeparatedPhrases.txt