私は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は学ぶ価値があります。うまくいけば友達になります。