Shell-Script
如何插入文件名作為文件頭?
範例:文件名: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
,這就是printf
anded
命令使用的內容。