ファイル名をファイルヘッダーに挿入するには?

ファイル名をファイルヘッダーに挿入するには?

例: ファイル名: 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それを使用します。printfed

おすすめ記事