Bash sed中oddlines的输出不显示在单独的行上

Bash sed中oddlines的输出不显示在单独的行上,bash,awk,sed,Bash,Awk,Sed,我有以下文件: >A6NGG8_201_I_F line2 >B1AK53_719_S_R line4 >B1AK53_744_D_N line5 >B7U540_205_R_H line6 >B7U540_354_T_M line7 我想打印出所有的奇数行。我可以通过以下方式做到这一点: $ sed -n 1~2p file >A6NGG8_201_I_F >B1AK53_719_S_R >B1AK53_744_D_N >B7U540

我有以下文件:

>A6NGG8_201_I_F
line2 
>B1AK53_719_S_R
line4
>B1AK53_744_D_N
line5
>B7U540_205_R_H
line6 
>B7U540_354_T_M
line7
我想打印出所有的奇数行。我可以通过以下方式做到这一点:

$ sed -n 1~2p file
>A6NGG8_201_I_F
>B1AK53_719_S_R
>B1AK53_744_D_N
>B7U540_205_R_H
>B7U540_354_T_M
所以我想在bash中将每行中的数字作为变量存储,但是我遇到了一个问题-存储sed的结果会将所有输出放在一行上:

#!/bin/bash

line1=$(sed -n 1~2p)
echo ${line1}
其中输出为:

>A6NGG8_201_I_F >B1AK53_719_S_R >B1AK53_744_D_N >B7U540_205_R_H >B7U540_354_T_M
所以当我做一些类似的事情时:

#!/bin/bash

line1=$(sed -n 1~2p)
pos=$(echo ${line1} | awk -F"[__]" 'NF>2{print $2}')
echo ${pos}
我明白了

201
我当然希望:

201
719
744
205
354

我如何将sed的结果存储到单独的行中,以便在管道传输到awk语句时正确处理它们?我知道您可以使用
/a
符号,但是当我尝试
sed-n'/1~2p/a'文件时,这在我的bash脚本中不起作用。谢谢

如评论中所述,您需要引用变量以实现此目的:

echo "${line1}"
而不是

echo ${line1}
但是,你可以直接说:

awk -F_ 'NR%2 && NF>2 {print $2}' file
这将处理偶数行,并在其中分开打印
\uu
上的第二个字段,只要有两个以上的字段


从中我观察到FASTA文件可以包含不同的格式。如果是这样的话,我猜您仍然希望在以“>”开头的行中获取ID。这可以翻译为:

awk -F_ '/^>/ && NF>2 {print $2}' file

请参见引用如何保留格式的示例:

文件:

$ cat a
hello
bye
将其读入变量:

$ var=$(< a)
让我们引用

$ echo "$var"
hello
bye

如果您试图从FASTA文件中获取头行,那么您的问题陈述是错误的——头之间的数据可能不止一行。你可以这么做

sed -n '/^>/!d;s/^[^_]*//;s/_.*//p' file.fasta
仅从每个标题行中获取第二个下划线分隔字段;或等效地,在Awk中

awk -F _ '/^>/ { print $2 }' file.fasta

只需引用它:
echo“$line1”
。但是,您可能希望以不同的方式处理清洁部分:此
-F“[\uu]”的逻辑是什么!哦,逻辑是它抓住了两个下划线之间的字符串。谢谢@fedorqui。我也会根据你的帖子改变我的过滤逻辑。很好!如果您开始在不同的位置使用
sed
awk
,将一个命令的结果传输到另一个命令,那么很可能您可以同时使用这两个命令:)这可能是重复的,或者至少是近似重复的;这里有许多关于FASTA处理的初级问题。
awk -F _ '/^>/ { print $2 }' file.fasta