我对 linux shell 命令很陌生。我需要阅读一个文本文件,其中包含几行“!Platform_series_id = GSE1145”。我应该在它的“=”符号部分之后拆分每一行以使用“ GSE1145 ”。最后,我想生成一个链接,例如 ' ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1145 /suppl/ 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
感谢您的帮助。
这是使用awk (1) 的信号。它的基本思想是读取行并自动将它们拆分,让您为所欲为。要让 awk 打印您的链接,
这将为文件中的每一行打印一些内容。awk 允许您通过行号或匹配正则表达式来选择处理方式。
awk 值得学习。善待它,它会成为你的朋友。