AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 441381
Accepted
Anna1364
Anna1364
Asked: 2018-05-03 10:55:56 +0800 CST2018-05-03 10:55:56 +0800 CST 2018-05-03 10:55:56 +0800 CST

如何将部分文件名粘贴到文件内容中?

  • 772

我有一个包含 1000 个文件的文件夹;前面的所有字符都是mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp指个人 ID(例如 NA21117,NA21119,NA21126,..)

NA21117.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21119.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21126.mapped.ILLUMINA.bwa.GIH.low_coverage.20121211.bam_dp
NA21127.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21137.mapped.ILLUMINA.bwa.GIH.low_coverage.20120522.bam_dp
NA21142.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp

每个文件只有一行:

cat NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
1   115258827   10

对于这些文件中的每一个,我想将单个 ID 粘贴到文件的内容中并得到如下输出:

1   115258827   10 NA21143

有什么办法吗?

text-processing
  • 4 4 个回答
  • 1041 Views

4 个回答

  • Voted
  1. glenn jackman
    2018-05-03T11:51:29+08:002018-05-03T11:51:29+08:00

    普通的 bash

    for file in *.bam_dp; do 
        contents=$(< "$file")
        echo "$contents ${file%%.*}" > "$file"
    done
    

    对于多行文件,仍然可以用普通 bash 完成

    for file in *.bam_dp; do 
        mapfile -t contents < "$file"
        printf "%s\n" "${contents[@]/%/ ${file%%.*}}" > "$file"
    done
    

    笔记:

    • 该mapfile命令将文件读入行数组。
    • 参数扩展对${var/pattern/string}变量值进行搜索和替换。(记录在手册中)
      • 如果模式以模式开头,%则该模式锚定在字符串的末尾。在这里,我匹配字符串末尾的空模式。
      • 变量可以是数组扩展,在这种情况下,每个数组元素都会发生替换。

    坦率地说,这种方法太聪明了,我会选择更明显的东西。

    • 4
  2. Best Answer
    codeforester
    2018-05-03T11:02:48+08:002018-05-03T11:02:48+08:00

    使用循环:

    #!/bin/bash
    
    shopt -s nullglob
    for file in ???????.mapped.*bam_dp; do
      [[ -f "$file" ]] || continue
      id=${file%%.*}              # grab the ID from file name
      sed -i "s/$/ $id/" "$file"  # modify the file in-place
    done
    
    • 2
  3. Ole Tange
    2018-05-03T11:13:11+08:002018-05-03T11:13:11+08:00

    从 $ARGV 中删除 .* 然后将 \t $ARGV 附加到文件中:

    perl -i -pe '$ARGV=~s/\..*//; s/$/\t$ARGV/;' NA*
    

    Glenn 的解决方案很可能运行得更快:

    perl -i -lpe '$_ .= " " . substr($ARGV,0,index($ARGV,"."))' NA*
    

    虽然如果每个文件只有一行,大部分时间将在驱动器上寻找。

    • 2
  4. Gaultheria
    2018-05-03T11:56:51+08:002018-05-03T11:56:51+08:00

    awk

    此方法与 GNU (Linux) 和 BSD (Mac) 版本兼容awk。

    awk '{ id=FILENAME ; sub(/\..*/,"",id) ; print $0 "\t" id }' *.bam_dp
    
    • id=FILENAME ; sub(/\..*/,"",id)
      将每个文件名的第一部分*.bam_dp(第一个之前的所有内容.)存储为id.
    • print $0 "\t" id
      打印每个文件的内容,然后是制表符,然后是记录的id.

    这将打印一个包含行的列表,如您的示例所示:

    1   115258827   10 NA21143
    

    原始文件不会被修改。> file.txt例如,您可以通过添加到命令末尾来保存此输出。

    • 1

相关问题

  • grep 从 $START 到 $END 的一组行并且在 $MIDDLE 中包含匹配项

  • 重新排列字母并比较两个单词

  • 在awk中的两行之间减去相同的列

  • 多行文件洗牌

  • 如何更改字符大小写(从小到大,反之亦然)?同时[重复]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve