Looping through the content of a file in Bash

后端 未结 13 2389
傲寒
傲寒 2020-11-21 10:08

How do I iterate through each line of a text file with Bash?

With this script:

echo \"Start!\"
for p in (peptides.txt)
do
    echo \"${p}\"
done


        
相关标签:
13条回答
  • 2020-11-21 10:37

    @Peter: This could work out for you-

    echo "Start!";for p in $(cat ./pep); do
    echo $p
    done
    

    This would return the output-

    Start!
    RKEKNVQ
    IPKKLLQK
    QYFHQLEKMNVK
    IPKKLLQK
    GDLSTALEVAIDCYEK
    QYFHQLEKMNVKIPENIYR
    RKEKNVQ
    VLAKHGKLQDAIN
    ILGFMK
    LEDVALQILL
    
    0 讨论(0)
  • 2020-11-21 10:41

    One way to do it is:

    while read p; do
      echo "$p"
    done <peptides.txt
    

    As pointed out in the comments, this has the side effects of trimming leading whitespace, interpreting backslash sequences, and skipping the last line if it's missing a terminating linefeed. If these are concerns, you can do:

    while IFS="" read -r p || [ -n "$p" ]
    do
      printf '%s\n' "$p"
    done < peptides.txt
    

    Exceptionally, if the loop body may read from standard input, you can open the file using a different file descriptor:

    while read -u 10 p; do
      ...
    done 10<peptides.txt
    

    Here, 10 is just an arbitrary number (different from 0, 1, 2).

    0 讨论(0)
  • 2020-11-21 10:41

    If you don't want your read to be broken by newline character, use -

    #!/bin/bash
    while IFS='' read -r line || [[ -n "$line" ]]; do
        echo "$line"
    done < "$1"
    

    Then run the script with file name as parameter.

    0 讨论(0)
  • 2020-11-21 10:43

    Here is my real life example how to loop lines of another program output, check for substrings, drop double quotes from variable, use that variable outside of the loop. I guess quite many is asking these questions sooner or later.

    ##Parse FPS from first video stream, drop quotes from fps variable
    ## streams.stream.0.codec_type="video"
    ## streams.stream.0.r_frame_rate="24000/1001"
    ## streams.stream.0.avg_frame_rate="24000/1001"
    FPS=unknown
    while read -r line; do
      if [[ $FPS == "unknown" ]] && [[ $line == *".codec_type=\"video\""* ]]; then
        echo ParseFPS $line
        FPS=parse
      fi
      if [[ $FPS == "parse" ]] && [[ $line == *".r_frame_rate="* ]]; then
        echo ParseFPS $line
        FPS=${line##*=}
        FPS="${FPS%\"}"
        FPS="${FPS#\"}"
      fi
    done <<< "$(ffprobe -v quiet -print_format flat -show_format -show_streams -i "$input")"
    if [ "$FPS" == "unknown" ] || [ "$FPS" == "parse" ]; then 
      echo ParseFPS Unknown frame rate
    fi
    echo Found $FPS
    

    Declare variable outside of the loop, set value and use it outside of loop requires done <<< "$(...)" syntax. Application need to be run within a context of current console. Quotes around the command keeps newlines of output stream.

    Loop match for substrings then reads name=value pair, splits right-side part of last = character, drops first quote, drops last quote, we have a clean value to be used elsewhere.

    0 讨论(0)
  • 2020-11-21 10:44
    #!/bin/bash
    #
    # Change the file name from "test" to desired input file 
    # (The comments in bash are prefixed with #'s)
    for x in $(cat test.txt)
    do
        echo $x
    done
    
    0 讨论(0)
  • 2020-11-21 10:46

    This is coming rather very late, but with the thought that it may help someone, i am adding the answer. Also this may not be the best way. head command can be used with -n argument to read n lines from start of file and likewise tail command can be used to read from bottom. Now, to fetch nth line from file, we head n lines, pipe the data to tail only 1 line from the piped data.

       TOTAL_LINES=`wc -l $USER_FILE | cut -d " " -f1 `
       echo $TOTAL_LINES       # To validate total lines in the file
    
       for (( i=1 ; i <= $TOTAL_LINES; i++ ))
       do
          LINE=`head -n$i $USER_FILE | tail -n1`
          echo $LINE
       done
    
    0 讨论(0)
提交回复
热议问题