Bash sed-未端接的's';命令

Bash sed-未端接的's';命令,bash,sed,Bash,Sed,我有这样一种代码的和平: cat BP.csv | while read line ; do goterm=$(awk '{print $1}') ; name=$(awk '{print $2}') ; grep -w "$goterm" GOEA.csv | sed "s/$goterm/pi/g" ; done 文件BP.csv具有以下格式: GO:0008283 cell proliferation GO:0009405 pathogenesis GO:00

我有这样一种代码的和平:

cat BP.csv | while read line ; do
    goterm=$(awk '{print $1}') ;
    name=$(awk '{print $2}') ;
    grep -w "$goterm" GOEA.csv | sed "s/$goterm/pi/g" ;
done
文件
BP.csv
具有以下格式:

GO:0008283  cell proliferation
GO:0009405  pathogenesis
GO:0010201  response to continuous far red light stimulus by the high-irradiance response system
GO:0009641  shade avoidance
4577    GO:0006807  0.994   2014_06_01
4577    GO:0016788  0.989   2014_06_01
4577    GO:0043169  0.977   2014_06_01
4577    GO:0043170  0.963   2014_06_01
GOEA.csv
具有以下格式:

GO:0008283  cell proliferation
GO:0009405  pathogenesis
GO:0010201  response to continuous far red light stimulus by the high-irradiance response system
GO:0009641  shade avoidance
4577    GO:0006807  0.994   2014_06_01
4577    GO:0016788  0.989   2014_06_01
4577    GO:0043169  0.977   2014_06_01
4577    GO:0043170  0.963   2014_06_01
sed
不起作用。例如,我想将
GO:0043170
更改为字符串“pi”,但它给出:

sed: -e expression #1, char 12: unterminated `s' command
为什么??
谢谢。

如果在没有输入的情况下运行
awk
命令,请尝试以下操作:

cat BP.csv | while read line ; do
    goterm=$(awk '{print $1}' <<< "$line") ;
    name=$(awk '{print $2}' <<< "$line" ) ;
    grep -w "$goterm" GOEA.csv | sed "s/$goterm/pi/g" ;
done
cat BP.csv |读取行时;做

goterm=$(awk'{print$1}'我会像这样重新构造整个过程:

while read goterm restofline
do
  grep -w "${goterm}" GOEA.csv | sed -e "s/${goterm}/pi/g"
done < BP.csv
读取goterm restofline时

做
grep-w“${goterm}”GOEA.csv | sed-e“s/${goterm}/pi/g”
完成
没有理由使用
awk
的东西,因为
bash
read
内置函数将为您提供基本的字段拆分,如果您给它多个变量。另外,您也没有使用
name
,因此不需要它。
cat
也没有必要

根据具体的用例,即使是
grep
也可能是不必要的,只需使用内部命令
sed-ne“s/${goterm}/pi/gp”GOEA.csv
。除非
grep-w
的目的是消除
${goterm}/code>是一个单词的子字符串而不是整个单词的行


作为将来的参考,在脚本中的循环上方插入一个
set-x
,将向您显示正在运行的确切命令,以便您可以将它们与您的预期进行比较。

让我们稍微整理一下这段代码:

while read goterm name
do
    grep -w "$goterm" GOEA.csv | sed "s/$goterm/pi/g"
done < BP.cvs
读取整行,同时:

while goterm name
将打破这一界限

goterm="GO:0008283"
name="cell proliferation"
还有一件事。当您同时使用
grep
sed
时,您可能只需要
sed

while read goterm name
do
    sed -n "/$goterm/s/$goterm/pi/gp" GOEA.csv
done < BP.csv
因此,我正在搜索其中包含
$goterm
的行,然后我将
$goterm
替换为
pi
-n
表示在sed处理行时不打印行,
p
表示在替换位置打印行


顺便说一下,
csv
作为文件后缀意味着逗号分隔的值,但两个文件看起来都不是逗号分隔的。这些选项卡是否分隔每个字段。如果是这样,您需要将
$IFS
修改为选项卡。

goterm的值是什么?@Avinash Raj,真的吗?您看不到goterm是文件BP.csv的第一列吗?单击,您确实看到了alise这两个
awk
命令都是从
stdin
读取的,不是从
$line
变量读取的,对吗?@Debasis,你真的这么问吗?@ams是对的,因为你的
awk
看起来特别有问题。整个脚本可以用awk本身重新编写。+1.awk实际上是针对stdin运行的,所以
$goterm
包含一个行输入将第一列值从第2行和第3行分开,由于“代码> S/SCOD>表达式在中间有一个未转义的文字行,SED说它没有终止。@那个家伙是正确的,否则AWK将等待输入。