我正在尝试遍历我的文件并以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行
答案 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"
返回不是标题的行。