我有这个输入文件
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/' <<< "gb|KY842329.1|"
输出KY842329.1
),但在循环内仅执行行返回。 else echo $line >> output_file
似乎有效。
答案 0 :(得分:2)
裸机:
$ sed 's/^[^|]*|\||[^|]*$//g' file
输出:
KY798440.1
KY842329.1
MG082893.1
MG173246.1
答案 1 :(得分:0)
你可以做
sed '/|/s/[^|]*|\([^|]*\)|.*/\1/' input
或
awk 'NF>1 {print $2} NF < 2 { print $1}' FS=\| input
或
sed -e 's/[^|]*|//' -e 's/|.*//' input