sed 中奇数行的输出没有出现在单独的行上

output of oddlines in sed not appearing on separate lines

我有以下文件:

>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 }')
echo ${pos}

我明白了

201

我当然想要的地方:

201
719
744
205
354

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

如评论中所述,您需要引用变量才能实现:

echo "${line1}"

而不是

echo ${line1}

不过,你可以直接说:

awk -F_ 'NR%2 && NF>2 {print }' file

这将处理偶数行,并在其中打印第 2 个字段 _ 分开,如果它有超过 2 个字段。


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

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

查看引用如何保留格式的示例:

文件:

$ cat a
hello
bye

读入变量:

$ var=$(< a)

echo 不加引号:

$ echo $var
hello bye

让我们引用!

$ echo "$var"
hello
bye

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

sed -n '/^>/!d;s/^[^_]*//;s/_.*//p' file.fasta

从每个 header 行中获取第二个 underscore-delimited 字段;或者等效地,在 Awk 中,

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