現在、ディレクトリに次のファイルがあります。
GCF_000901975.1_ViralProj181986_genomic.fna.gz
GCF_001885505.1_ViralProj344311_genomic.fna.gz
GCF_000901995.1_ViralProj181990_genomic.fna.gz
GCF_001041015.1_ViralProj287961_genomic.fna.gz
現在のファイルの名前をこのように変更したい
GCF_000901975.1
GCF_001885505.1
GCF_000901995.1
GCF_001041015.1
以下のスクリプトを使用してインポートしますが失敗します。
for file in `ls | grep .gz`
do
newfile=`echo $file | awk -F "_" '{print $1,"_",$2,".gz"| sed 's/ //g"`
mv $file $newfile
done
誰でも私にアドバイスを与えることができますか?あるいは、「分割」を試して監査する必要があるかもしれません。
答え1
まず、出力解析の防止ls
。次に、ls
出力を解析する必要がある理由(ここにはありません)があっても、それを渡す理由はありませんgrep
。ls *gz
で終わるファイルとディレクトリ名のみがリストされますgz
(ただし、ディレクトリもリストされていることに注意してください)。で終わるコンテンツ名とは異なり、)やをgz
使用しない限り、ファイルは一致せず、名前に改行文字を含むファイルと一致します。ls -d
ls | grep .gz
not.a.gz.file
とにかく、ls
ここではまったく必要ないし望まない。必要なのは、for file in *gz
任意のファイル名を処理できるため、これがより良いアプローチであることです(変数を正しく引用する限り)。
したがって、ループは次のようによく書くことができます。
for file in *.gz; do
newfile=$(echo "$file" | awk -F "_" '{print $1"_"$2".gz"}' | sed 's/ //g')
mv -- "$file" "$newfile"
done
awk
部品を開く前に閉じていないので、awkコマンドとsedコマンドを修正し、すべての変数をどのように引用したかをsed
確認してください。また、印刷された各項目(または変数に設定した項目),
の間にスペースを追加するときにawkステートメントを削除した方法を確認してください。これprint
OFS
--
コマンドラインオプションの終わりを示すために使用されます。そしてコマンドが-
。
次に、本当に必要ではないか、awk
まったくsed
必要ありません。シェルを使用できます。
for f in *gz; do
echo mv -- "$f" "${f%%_V*}"
done
構文${variable%%pattern}
("${f%%_V*}") means "return the value of $variable after removing the longest string matching $pattern from the end". So, in this case, it means "remove everything from the first
_V` which comes before a
。これについての詳細を読むことができます。ここ:
${パラメータ%%単語}
単語が展開され、パターンが生成され、以下の規則に従って一致します(パターン一致を参照)。パターンがパラメータ拡張値の末尾の部分と一致する場合、拡張結果は、最短一致パターン(「%」ケース)または最長一致パターン(「%%」ケース)を持つパラメータ値を削除します。パラメータが「@」または「の場合'を使用すると、各位置引数にパターン除去操作が順番に適用され、拡張が結果リストになります。パラメータが配列変数の場合、下付き文字は「@」または「'パターン除去操作は配列の各メンバーに順番に適用され、拡張は結果のリストです。
期待どおりに機能することに満足したら、削除してやり直してecho
実際にファイル名を変更してください。
最後に、perl-rename(DebianベースのLinuxディストリビューションから呼び出されます)がある場合は、rename
次のこともできます。
$ rename -n -- 's/_V.*//s' *gz
GCF_000901975.1_ViralProj181986_genomic.fna.gz -> GCF_000901975.1
GCF_000901995.1_ViralProj181990_genomic.fna.gz -> GCF_000901995.1
GCF_001041015.1_ViralProj287961_genomic.fna.gz -> GCF_001041015.1
GCF_001885505.1_ViralProj344311_genomic.fna.gz -> GCF_001885505.1
よかったら、削除し-n
て実際にファイル名を変更してください。
答え2
for i in $(ls GCF*.gz); do var=$(echo $i | awk -F "_" '{print $1"_"$2}'); echo $var; mv $i $var; done
awkメソッド
ls -ltr | awk '/GCF.*gz/{print "mv "$NF" "substr($NF,1,15)}'|sh