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 / 问题 / 490597
Accepted
Dimitris Mintis
Dimitris Mintis
Asked: 2018-12-24 04:56:45 +0800 CST2018-12-24 04:56:45 +0800 CST 2018-12-24 04:56:45 +0800 CST

从文件中复制某些空格

  • 772

我有一个看起来像这样的文件

   18DMA      H 9996   0.886   5.687   5.320
   18DMA      H 9997   1.019   5.764   5.247
   18DMA     Np 9998   0.947   5.584   5.151
   18DMA      H 9999   1.033   5.541   5.113
   18DMA     Cn10000   0.880   5.674   5.050
   18DMA      H10001   0.831   5.616   4.971
   18DMA      H10002   0.814   5.751   5.091
   18DMA      H10003   0.957   5.735   5.003
   18DMA     Cn10004   0.837   5.486   5.185

期望的输出是删除第 3 列,但是由于从某个行/行开始,接下来在原子名称和编号之间没有空格,我无法按列进行删除。有没有办法通过选择一定数量的字符来进行删除?期望的输出应该是

   18DMA      H    0.886   5.687   5.320
   18DMA      H    1.019   5.764   5.247
   18DMA     Np    0.947   5.584   5.151
   18DMA      H    1.033   5.541   5.113
   18DMA     Cn    0.880   5.674   5.050
   18DMA      H    0.831   5.616   4.971
   18DMA      H    0.814   5.751   5.091
   18DMA      H    0.957   5.735   5.003
   18DMA     Cn    0.837   5.486   5.185
text-processing
  • 5 5 个回答
  • 289 Views

5 个回答

  • Voted
  1. peterph
    2018-12-24T05:10:37+08:002018-12-24T05:10:37+08:00

    cut在字符模式下使用:

    cut -c1-15,21-
    

    您可能需要调整确切的字符数。同样,这假设输入不使用制表符(\t字符)作为分隔符(它可能不使用,因为这样你就不会首先遇到连接字段的问题)。

    如果有制表符,则expand程序可以将它们转换为空格。

    • 8
  2. Best Answer
    RudiC
    2018-12-24T05:07:54+08:002018-12-24T05:07:54+08:00

    假设您没有<TAB>s 但有多个空格作为字段分隔符,并且通过查看和计算您的样本数据,我想出了

      $ sed -E 's/^(.{15}).{5}/\1/' file
       18DMA      H   0.886   5.687   5.320
       18DMA      H   1.019   5.764   5.247
       18DMA     Np   0.947   5.584   5.151
       18DMA      H   1.033   5.541   5.113
       18DMA     Cn   0.880   5.674   5.050
       18DMA      H   0.831   5.616   4.971
       18DMA      H   0.814   5.751   5.091
       18DMA      H   0.957   5.735   5.003
       18DMA     Cn   0.837   5.486   5.185
    

    它在ubstitute 命令\1 的替换部分使用前 15 个字符的“反向引用”来恢复它们。s

    • 5
  3. Kusalananda
    2018-12-24T05:09:19+08:002018-12-24T05:09:19+08:00
    $ awk -v OFS='\t' 'NF == 5 { sub("[0-9]*$", "", $2) } NF == 6 { $0 = $1 OFS $2 OFS $4 OFS $5 OFS $6 } { print }' file
    18DMA   H       0.886   5.687   5.320
    18DMA   H       1.019   5.764   5.247
    18DMA   Np      0.947   5.584   5.151
    18DMA   H       1.033   5.541   5.113
    18DMA   Cn      0.880   5.674   5.050
    18DMA   H       0.831   5.616   4.971
    18DMA   H       0.814   5.751   5.091
    18DMA   H       0.957   5.735   5.003
    18DMA   Cn      0.837   5.486   5.185
    

    这个简短awk的程序将对输入行执行不同的操作,具体取决于它是否包含 5 个或 6 个空格分隔的字段。

    如果它包含五个字段,它会删除第二个字段末尾的所有数字并保留其余部分。如果它包含六个字段,它会重写该行但省略第三个字段。

    输出将以制表符分隔(或由您OFS在命令行上设置的任何内容分隔)。

    • 4
  4. Ritajit Kundu
    2018-12-25T00:28:05+08:002018-12-25T00:28:05+08:00

    怎么用vim?

    vim +"%s/\([A-Za-z]\)\@<=\s\?\d\+//g" +"w file1" +"q\!" file
    

    regexvim中的thiscommand找到确切的模式,删除它们并将文件保存为 file1 并退出vim。你想要的格式化的东西现在在file1.
    看,最终vim是穷人 的sed,,,,awk等等。perl -e 's/.../'trcut

    注意:这也适用于vi. 爆炸前的斜线( \! )逃脱爆炸。正则表达式是 vim 风格的。

    • 1
  5. Uncle Billy
    2018-12-24T22:45:58+08:002018-12-24T22:45:58+08:00

    如果我是你,我会先“修复”原文,然后简单地删除该列。不过,您可以一次性完成这两项操作:

    awk '{sub(/[0-9]+/," &",$2); $0=$0; $3=""; print}' input_file
    
    18DMA H  0.886 5.687 5.320
    18DMA H  1.019 5.764 5.247
    18DMA Np  0.947 5.584 5.151
    18DMA H  1.033 5.541 5.113
    18DMA Cn  0.880 5.674 5.050
    18DMA H  0.831 5.616 4.971
    18DMA H  0.814 5.751 5.091
    18DMA H  0.957 5.735 5.003
    18DMA Cn  0.837 5.486 5.185
    

    该$0=$0分配将导致awk重新计算(并重新拆分)当前行。与所有其他答案不同,这仅对第二个字段的可能格式做出假设,而不是关于字段的长度或数量。

    将使用 Tab 作为输出字段分隔符的版本:

    awk -vOFS='\t' '{sub(/[0-9]+/," &",$2); $0=$0; $3=""; sub(OFS OFS,OFS); print}' input_file
    
    18DMA   H       0.886   5.687   5.320
    18DMA   H       1.019   5.764   5.247
    18DMA   Np      0.947   5.584   5.151
    18DMA   H       1.033   5.541   5.113
    18DMA   Cn      0.880   5.674   5.050
    18DMA   H       0.831   5.616   4.971
    18DMA   H       0.814   5.751   5.091
    18DMA   H       0.957   5.735   5.003
    18DMA   Cn      0.837   5.486   5.185
    

    额外的sub(OFS OFS, OFS)将折叠由创建的空字段$3=""。仅当文件要由专门需要制表符分隔字段的工具或出于美学原因处理时,才需要这样做。

    • 0

相关问题

  • 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