Pri*_*iya 2 sed shell-script text-processing filenames
示例:文件名:ENSG00000000003
ENSG00000000003 43120.829491094
ENSG00000000005 39604.4956791524
ENSG00000000419 7645.05624570546
ENSG00000000457 2157.49855156382
ENSG00000000460 3317.98417717746
ENSG00000000938 6327.40515535397
Run Code Online (Sandbox Code Playgroud)
预期产出;理想情况下,文件名前面有一个制表符:
ENSG00000000003
ENSG00000000003 43120.829491094
ENSG00000000005 39604.4956791524
ENSG00000000419 7645.05624570546
ENSG00000000457 2157.49855156382
ENSG00000000460 3317.98417717746
ENSG00000000938 6327.40515535397
Run Code Online (Sandbox Code Playgroud)
我想对我的 45000 个文件一起循环执行此操作
我会使用标准的 UNIX 编辑器(当然!):
for f in ENSG*
do
printf '1i\n\t%s\n.\nw\nq\n' "$f" | ed -s "$f"
done
Run Code Online (Sandbox Code Playgroud)
这会向 发送一个小命令脚本ed,即:
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 {} \;
Run Code Online (Sandbox Code Playgroud)
核心解决方案是相同的,但包含在我所谓的“查找外壳”中——为匹配的每个(单个)文件名find执行sh -c ...;该findsh字符串是一个存根名称,$0文件名被传递到该 shell 以代替{}花括号。然后外壳本身将文件名作为参数$1,这就是printfanded命令使用的内容。