【问题标题】:sed command within a while loop doesn't write outputwhile 循环中的 sed 命令不写入输出
【发布时间】:2021-02-04 21:09:55
【问题描述】:

我有这个输入文件

gb|KY798440.1|
gb|KY842329.1|
MG082893.1
MG173246.1

我想获取“|”之间的所有字符如果没有“|”,则为整行。这是一个期望的输出,看起来像

KY798440.1
KY842329.1
MG082893.1
MG173246.1

我写道:

while IFS= read -r line; do
    if [[ $line == *\|* ]] ; then
    sed 's/.*\|\(.*\)\|.*/\1/' <<< $line >> output_file
    else echo $line >> output_file
     fi
done < input_file

这给了我

empty line
empty line
MG082893.1
MG173246.1

(注意:empty line 表示实际的空行 - 它实际上并不写“空行”)

sed 命令适用于单个示例(即sed 's/.*\|\(.*\)\|.*/\1/' &lt;&lt;&lt; "gb|KY842329.1|" 输出KY842329.1),但在循环中它只执行一行返回。 else echo $line &gt;&gt; output_file 似乎有效。

【问题讨论】:

  • 为什么要使用 while/read 循环而不是让 sed 处理文件?

标签: bash sed while-loop


【解决方案1】:

裸 sed:

$ sed 's/^[^|]*|\||[^|]*$//g' file

输出:

KY798440.1
KY842329.1
MG082893.1
MG173246.1

【讨论】:

  • 哦,太尴尬了。我以为我试过了……不过还是谢谢!
【解决方案2】:

你可以的

sed '/|/s/[^|]*|\([^|]*\)|.*/\1/' input

awk 'NF>1 {print $2} NF < 2 { print $1}' FS=\| input

sed -e 's/[^|]*|//' -e 's/|.*//' input

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2017-11-25
    • 1970-01-01
    • 2015-04-19
    • 2017-10-17
    • 2013-06-14
    • 1970-01-01
    • 2012-01-02
    • 2014-12-21
    相关资源
    最近更新 更多