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

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

私は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」を使用するには、各行を分割する必要があります。

使用する信号ですアッ(1)基本的なアイデアは、自動的に行を読み、分割して必要なことをできるようにすることです。リンクをawkとして印刷するには、

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

これは印刷されますファイルの各行について。 awkを使用すると、行番号または正規表現一致で処理する行を選択できます。

awkは学ぶ価値があります。うまくいけば友達になります。

おすすめ記事