例: ファイル名: ENSG00000000003
ENSG00000000003 43120.829491094
ENSG00000000005 39604.4956791524
ENSG00000000419 7645.05624570546
ENSG00000000457 2157.49855156382
ENSG00000000460 3317.98417717746
ENSG00000000938 6327.40515535397
予想される出力は、ファイル名の前にタブ文字があることが最善です。
ENSG00000000003
ENSG00000000003 43120.829491094
ENSG00000000005 39604.4956791524
ENSG00000000419 7645.05624570546
ENSG00000000457 2157.49855156382
ENSG00000000460 3317.98417717746
ENSG00000000938 6327.40515535397
45000個のファイルを一緒にループでこれを実行したいと思います。
答え1
私は標準のUNIXエディタ(確かに!):
for f in ENSG*
do
printf '1i\n\t%s\n.\nw\nq\n' "$f" | ed -s "$f"
done
これにより、次の小さなコマンドスクリプトが送信されますed
。
- 行1に
i
テキストを挿入します()。テキストはprintf
タブ(\t
)の前にファイル名として渡されます。 - テキストを挿入(
.
)した後、ファイルをディスクに保存(w
)して終了(q
)します。
ファイル数がコマンドライン制限を超えることが真である場合は、次のコマンドを使用してfind
必要に応じてパラメータ(起動ディレクトリ、ファイル名など)を調整できます。
find . -name 'ENSG*' -exec sh -c 'printf "1i\n\t%s\\n.\nw\nq\n" "$1" | ed -s "$1" ' findsh {} \;
コアソリューションは同じですが、一致するfind
各(単一)ファイル名に対して実行される「シェルの検索」に含まれています。sh -c ...
文字列findsh
はスタブ名$0
で、ファイル名は中括弧ではなくシェルに渡されます{}
。その後、シェル自体はファイル名を引数として使用するため、コマンドは$1
それを使用します。printf
ed
答え2
または、コマンドライン制限(引数の長さまたは数)なしで単一の呼び出しed
で、withを引き続き使用する場合:zsh
printf 'e %s\n1i\n\t%1$s\n.\nw\nq\n' * | ed
(zsh
はパラメータを再利用できる指定子をサポートしていprintf
ます%m$
。)