区切り文字で分割して文字列を連結する問題

区切り文字で分割して文字列を連結する問題

私はLinuxシェルコマンドについて非常に初心者です。'!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 は学ぶ価値があります。丁寧に扱えば、あなたの友達になるでしょう。

関連情報