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
我有以下文件:
>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 个字段。
来自
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