루프 변수를 유지하면서 구분 기호로 구분된 요소 추출

루프 변수를 유지하면서 구분 기호로 구분된 요소 추출

저는 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

관련 정보