按分隔符號分割並連接字串問題

按分隔符號分割並連接字串問題

我對 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值得學習。善待它,它就會成為你的朋友。

相關內容