按分隔符分割并连接字符串问题

按分隔符分割并连接字符串问题

我对 Linux shell 命令非常陌生。我需要读取一个文本文件,其中包含多行“!Platform_series_id = GSE1145”。我应该分割每一行以使用 'GSE1145' 在其'=' 符号部分之后。最后我想生成一个链接,例如'ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/GSE1145/补充/GSE1145_RAW.tar' 链接的粗体部分将从 txt 文件中获取。其余部分不变。这就是故事。

如果我到了被卡住的地步:

当我运行以下代码时

while read p; do
  A="$(cut -d'=' -f2 <<<$p)"
  echo "ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/$A/suppl/$A_RAW.tar"
done < a.txt

它给出了意想不到的结果

/suppl/.tarcbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1145 /suppl/.tarcbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1643

然后我尝试简单地连接相同的变量

while read p; do
  A="$(cut -d'=' -f2 <<<$p)"
  echo "$A$A"
done < a.txt

但答案仍然不是我所期望的。它的行为就像 echo $A 所写的那样。

GSE1145 GSE1643

为了理解这个问题,最后我尝试了以下代码:

A="$(cut -d'=' -f2 <<< '!Platform_series_id = GSE1145')"
echo $A$A

它给了我一个正确的结果

GSE1145 GSE1145

那么我读的时候有什么问题呢?

顺便说一句,当我尝试以下代码时,它有效!但为什么?我认为这不是正确的方法。如果我放置的空格与 $A 的长度一样多,

while read p; do
  A="$(cut -d'=' -f2 <<<$p)"
  echo "        $A$A"
done < a.txt

GSE1145 GSE1145 GSE1643 GSE1643

感谢您的帮助。

答案1

我应该将每一行拆分为在“=”符号后使用“GSE1145”

这是一个要使用的信号awk(1).它的基本思想是自动读取行并分割它们,让你做你想做的事。要使 awk 打印您的链接,

awk -F ' += +' \
    '{ printf "ftp://ftp.ncbi.nlm.nih.gov" \
              "/geo/series/GSE5nnn/%s/suppl/%s_RAW.tar", $2, $2 }' filename

这将打印某物对于文件中的每一行。 awk 允许您通过行号或匹配正则表达式来选择处理哪些行。

awk值得学习。善待它,它就会成为你的朋友。

相关内容