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 / 问题 / 746959
Accepted
Giulio Centorame
Giulio Centorame
Asked: 2023-05-25 11:40:25 +0800 CST2023-05-25 11:40:25 +0800 CST 2023-05-25 11:40:25 +0800 CST

使用额外的空格更改不规则标题

  • 772

我正在使用这种晦涩的文件格式处理数据:

   SNP  A1  A2   F1 I1 F2 I2 F3 I3
rs0001   A   C   0.02 0.00 1.99

(注意前三个字段周围的空格)

标头很长(500k 条目),我想将其转换为如下内容:

   SNP  A1  A2   F1_I1 F2_I2 F3_I3
rs0001   A   C   0.02 0.00 1.99

...这样无论是否删除不规则的空白,都可以更轻松地处理。作为参考,这也是可以接受的,只要它是一致的:

SNP A1 A2 F1_I1 F2_I2 F3_I3
rs0001 A C 0.02 0.00 1.99

有什么办法可以在 Unix/Linux 中重新格式化它吗?谢谢

text-formatting
  • 2 2 个回答
  • 43 Views

2 个回答

  • Voted
  1. Stéphane Chazelas
    2023-05-25T14:18:21+08:002023-05-25T14:18:21+08:00

    您可以用sed以下内容覆盖第一行:

    sed -E 's/(F[[:digit:]]+) (I[[:digit:]])/\1_\2/g;q' < file 1<> file
    

    这很有效,因为我们只读取和写入第一行。这只是一件有效的事情,因为我们正在写一行与我们阅读的那行长度完全相同的行。Fn如果和之间可能有多个空格,In而您只想用一个替换它们_,则不能使用该方法,而必须重写整个文件,例如:

    perl -pi -e 's/(F\d+)\s+(I\d)/${1}_${2}/g if $. == 1' file
    

    这会创建一个新的file作为原始文件的编辑副本。一些sed实现已经-i从perl. 例如,使用 GNU sed:

    sed -Ei '1s/(F[[:digit:]]+)\s+(I[[:digit:]])/\1_\2/g' file
    

    也会工作。对于其他一些sed实现,您需要-i ''. 您可能还需要替换\s为[[:space:]].

    要用一个空格替换一个或多个空白字符的任何序列,您可以执行s/[[:space:]]+/ /g(with perl,您需要添加该-l选项,否则同样是空白的行定界符将包含在模式空间中并最终被替换带空格)。

    F<digits> I<digit>请注意,正则表达式匹配不是很严格,如果在行中的任何地方查找,那么会在例如中找到它。可以使用以下方法进行更严格的匹配:PAF12 I0therperl

    perl -pi -e 's/(?<!\S)(F\d+)\s+(I\d+)(?!\S)/${1}_${2}/g if $. == 1' file
    

    我们使用否定环视运算符来检查前后的内容是否不是非空白字符。

    • 1
  2. Best Answer
    Hans-Martin Mosner
    2023-05-25T16:28:06+08:002023-05-25T16:28:06+08:00

    您链接到的 plink 文件格式规范包含许多奇怪的细节。

    首先,有一些示例,其中“F1 I1”和“F2 I2”清楚地表示两个不同(但相关)列的标题:

        SNP  A1  A2   F1 I1       F2 I2        F3 I3
     rs0001   A   C   0.98 0.02   1.00 0.00    0.00 0.01 
     rs0002   G   A   0.00 1.00   0.00 0.00    0.99 0.01  
    

    但是还有您给出的示例,尽管Ix标题存在,但看起来列值丢失了:

        SNP  A1  A2   F1 I1 F2 I2 F3 I3
     rs0001   A   C   0.02 0.00 1.99
    

    对我来说,不清楚这个例子是错误的还是数据实际上可以这样格式化。与该dose1选项相关的评论似乎暗示可以使用单列剂量数据而不是明显正常的两列格式:“剂量数据是 0..1,而不是 0..2 比例”。根据我的直觉,看起来只有一个值的示例数据的标题混淆了。

    如何处理不精确的规范和仅部分符合您对规范的理解的数据总是很困难的。您需要决定您的数据解析器应该有多大的容忍度,以便它能够正确处理带有轻微标题问题的文件,同时仍然标记无效数据。

    关于您的实际文件处理问题:如果有一些外部指示器告诉您文件是否具有单值或双值剂量数据,我会使用您熟悉的Ix任何脚本或文本处理语言完全删除标题,无论它是sed, awk, perl,python或其他什么。

    • 1

相关问题

  • 从 txt 文件中计算矩阵,grep -c 用于制表符分隔的文件?[关闭]

  • bash 脚本:更改输出 uniq -c

  • 并排排序两个用空格分隔的列表[重复]

  • AWK/GAWK 在模式匹配后添加字符

  • 使用 awk 打破时间戳并格式化

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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