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 / 问题 / 708861
Accepted
Venem
Venem
Asked: 2022-07-07 08:58:58 +0800 CST2022-07-07 08:58:58 +0800 CST 2022-07-07 08:58:58 +0800 CST

根据行内容排列文本

  • 772

是否可以插入新行以排列文件的内容?

我有:

1:1   Lorem ipsum dolor sit amet consectetur    1:1   This is sample text of varying length.
      adipiscing elit.                          1:2   This is another paragraph in this file.
1:2   Vivamus integer non suscipit taciti mus         Yet another sentence in this paragraph.
      etiam at primis tempor sagittis.          1:3   Another paragraph can be found here!

如何适当地添加空格以使数字对齐?

预期输出:

1:1   Lorem ipsum dolor sit amet consectetur          This is sample text of varying length.
      adipiscing elit.                          
1:2   Vivamus integer non suscipit taciti mus         This is another paragraph in this file.    
      etiam at primis tempor sagittis.                Yet another sentence in this paragraph.
1:3                                                   Another paragraph can be found here!

编辑:由于线条会排列,因此无需重复数字,因此可以将其删除。

POSIX 合规性是首选。

shell posix
  • 1 1 个回答
  • 55 Views

1 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2022-07-07T11:08:24+08:002022-07-07T11:08:24+08:00

    使用 GNUawk将文本作为固定宽度的记录集读取,其中每条记录分为宽度为 6(左标签)、42(文本左行)、6(右标签)和 42(右行)的字段文本):

    BEGIN {
            FIELDWIDTHS = "6 42 6 42"
    }
    
    # New label seen on the left hand side.
    # If this is a completely new label, then
    # add it to the end of the "labels" array.
    $1 != "      " {
            llabel = $1
            if (!seenlabels[llabel]++)
                    labels[++n] = llabel
    }
    
    # Same as above, but for the right hand side.
    $3 != "      " {
            rlabel = $3
            if (!seenlabels[rlabel]++)
                    labels[++n] = rlabel
    }
    
    # Add text to the labelled paragraphs, left and right,
    # as strings delimited by ORS (newline).
    {
            ltext[llabel] = (ltext[llabel] == "" ? $2 : ltext[llabel] ORS $2)
            rtext[rlabel] = (rtext[rlabel] == "" ? $4 : rtext[rlabel] ORS $4)
    }
    
    # At end, output.
    END {
            # Iterate over all paragraphs (there are "n" of them).
            for (i = 1; i <= n; ++i) {
                    delete llines
                    delete rlines
    
                    # Split the text for the left and right paragraph,
                    # into arrays, "llines" and "rlines".
                    a = split(ltext[labels[i]], llines, ORS)
                    b = split(rtext[labels[i]], rlines, ORS)
    
                    # The arrays may be of different lengths, but
                    # "c" will be the length of the longest, i.e.
                    # the number of lines of the paragraph to the
                    # left or right, whichever is longes.
                    c = (a > b ? a : b)
    
                    # Print the first line of the left and right
                    # of this paragarph (includes the label at the left).
                    printf("%-6s%-42s%-6s%-42s\n", labels[i], llines[1], "", rlines[1])
    
                    # Then print the other lines (no label).
                    for (j = 2; j <= c; ++j)
                            printf("%-6s%-42s%-6s%-42s\n", "", llines[j], "", rlines[j])
            }
    }
    

    测试:

    $ cat file
    1:1   Lorem ipsum dolor sit amet consectetur    1:1   This is sample text of varying length.
          adipiscing elit.                          1:2   This is another paragraph in this file.
    1:2   Vivamus integer non suscipit taciti mus         Yet another sentence in this paragraph.
          etiam at primis tempor sagittis.          1:3   Another paragraph can be found here!
    
    $ gawk -f script file
    1:1   Lorem ipsum dolor sit amet consectetur          This is sample text of varying length.
          adipiscing elit.
    1:2   Vivamus integer non suscipit taciti mus         This is another paragraph in this file.
          etiam at primis tempor sagittis.                Yet another sentence in this paragraph.
    1:3                                                   Another paragraph can be found here!
    

    awk由于这是对(变量)的 POSIX 规范使用 GNU 特定的扩展FIELDWIDTHS,因此它不是严格的 POSIX 答案。

    对于符合 POSIX 的答案,只需将该BEGIN部分替换为:

    {
        rec = $0
        $0 = ""
        $1 = substr(rec,1,6)
        $2 = substr(rec,7,42)
        $3 = substr(rec,49,6)
        $4 = substr(rec,55)
    }
    
    • 3

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

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