Shell-Script

如何插入文件名作為文件頭?

  • May 14, 2019

範例:文件名: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 個文件循環執行此操作

我會使用標準的 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並且文件名被傳遞到該 shell 以代替{}花括號。然後,shell 本身將文件名作為參數$1,這就是printfanded命令使用的內容。

引用自:https://unix.stackexchange.com/questions/518712