访问for循环bash中的下一项

时间:2017-11-09 14:48:02

标签: bash

我正在尝试遍历我的文件并以2个为一组获取行。文件中的每个数据条目都包含一个标题行,然后以下行包含数据。

我正在尝试:遍历文件,抓住每两行并操纵它们。我目前的问题是我试图回应循环中的下一行。因此,每当我点击标题行时,它都会打印出数据行(下一行)。

out="$(cat $1)" #file
file=${out}

iter=0
for line in $file;
do
    if [ $((iter%2)) -eq 0 ];
    then
            #this will be true when it hits a header
            echo $line
            # I need to echo the next line here
    fi
    echo "space"
    iter=$((iter+1))

done

以下是可能的输入文件示例:

>fc11ba964421kjniwefkniojhsdeddb4_runid=65bedc43sdfsdfsdfsd76b7303_read=42_ch=459_start_time=2017-11-01T21:10:05Z <br>
TGAGCTATTATTATCGGCGACTATCTATCTACGACGACTCTAGCTACGACTATCGACTCGACTACSAGCTACTACGTACCGATC
>fd38df1sd6sdf9867345uh43tr8199_runid=65be1fasdfsdfgdsfg4376b7303_read=60_ch=424_start_time=2017-11-01T21:10:06Z <br>
TGAGCTATTATTATCGGCGACTATCTATCTACGACGACTCTAGCTACGACTATCGACTCGACTACSAGCTACTACGTACCGATC
>1d03jknsdfnjhdsf78sd89ds89cc17d_runid=65bedsdfsdfsdf03_read=24_ch=439_start_time=201711-01T21:09:43Z <br>
TGAGCTATTATTATCGGCGACTATCTATCTACGACGACTCTAGCTACGACTATCGACTCGACTACSAGCTACTACGTACCGATC

标题行以>开头,数据是包含TGACATC

的行

编辑:

对于那些询问输出的人,基于原始问题,我试图一起访问标题和数据。每个标题和匹配数据将被处理6次。最终目标是拥有每个标头和数据对:

&gt; fc11ba964421kjniwe(原始标题)
GATATCTAGCTACTACTAT(原始数据)

翻译为:

&gt; F1_fc11ba964421kjniwe
ASNASDKLNASDHGASKNHDLK
&GT; F2_fc11ba964421kjniwe
ASHGASKNHDLKNASDKLNASD
&GT; F3_fc11ba964421kjniwe
KNHDLKNASDKLNASDASHGAS
&GT; R1_fc11ba964421kjniwe
ASHGLKNASDKLNASDASKNHD
&GT; R2_fc11ba964421kjniwe
AKNASDKLNASDSHGASKNHDL
&gt; R3_fc11ba964421kjniwe
SKNHDLKNASDKASHGALNASD

然后下一个标题和数据条目将生成另外6行

2 个答案:

答案 0 :(得分:1)

如果您知道您的记录每个都包含2行,请在read循环的每次迭代中使用while命令两次。

while IFS= read -r line1; IFS= read -r line2; do
    ...
done < "$1"

答案 1 :(得分:0)

您的for line in $file符号不起作用;在bash中,in之后的文本是一系列值,而不是输入文件。您可能正在寻找的是while read循环,它将文件作为标准输入。像这样:

while read -r header; do

  # We should be starting with a header.
  if [[ $header != >* ]]; then
    echo "ERROR: corrupt header: $header" >&2
    break
  fi

  # read the next line...
  read -r data

  printf '%s\n' "$data" >> data.out

done < "$file"

我不知道你在寻找什么输出,所以我只是做了些什么。此循环使用if语句强制执行标头位置,并将数据行打印到输出文件。

当然,如果你不想要这种强制执行,你可以简单地说:

grep -v '^>' "$file"

返回不是标题的行。