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 / 问题 / 569435
Accepted
Kalpesh Bhoj
Kalpesh Bhoj
Asked: 2020-02-25 08:06:54 +0800 CST2020-02-25 08:06:54 +0800 CST 2020-02-25 08:06:54 +0800 CST

如何将单列转换为 3 列?

  • 772

我有一个包含数据的大文本文件,格式如下:

1
2
3
4
5
6
7
8
9
10

我正在尝试将其转换为:

1           2             3
4           5             6
7           8             9
10

我试过awk:

'{ if (NR%2) {printf "%40s\n", $0} else {printf "%80s\n", $0} }' file.txt
awk text-formatting
  • 8 8 个回答
  • 3035 Views

8 个回答

  • Voted
  1. Best Answer
    Paulo Tomé
    2020-02-25T09:06:33+08:002020-02-25T09:06:33+08:00

    一个解决方案 paste

    seq 10 | paste - - -
    1       2       3
    4       5       6
    7       8       9
    10
    

    paste是一个 Unix 标准工具,该标准保证这至少适用于 12 列。

    • 42
  2. JoL
    2020-02-25T23:36:54+08:002020-02-25T23:36:54+08:00

    该columns工具可以做到这一点:

    $ seq 10 | columns -W 16 -c 3
    1     2     3
    4     5     6
    7     8     9
    10
    

    -W 16只是将线宽设置为较小的值。

    columns不是 Unix 标准工具。它是GNU AutoGen的一部分。

    更常见的column命令的某些版本可能能够使用 设置列数-c,但现代版本似乎已经改变了它的含义,以通过字符数设置行宽。

    mpez0 在评论中也pr建议:

    $ seq 10 | pr -aT3
    1           2           3
    4           5           6
    7           8           9
    10
    

    -aT3是 的缩写--across --omit-pagination --columns=3。

    pr在 coreutils 和 POSIX 中,尽管-T/--omit-pagination似乎是特定于 GNU 的。

    • 8
  3. RudiC
    2020-02-25T08:22:27+08:002020-02-25T08:22:27+08:00

    试试喜欢

    seq 1 10 | awk '{printf "%40s", $0} !(NR%3) {printf "\n"}'
                                           1                                       2                                       3
                                           4                                       5                                       6
                                           7                                       8                                       9
                                          10
    
    • 7
  4. Toby Speight
    2020-02-26T03:56:36+08:002020-02-26T03:56:36+08:00

    这项工作的工具是rs(“重塑”):

    $ seq 10 | rs 0 3
    1   2   3
    4   5   6
    7   8   9
    10  
    

    我们可以将列分隔符更改为制表符:

    $ seq 10 | rs -C 0 3
    1       2       3
    4       5       6
    7       8       9
    10
    

    或右对齐:

    $ seq 10 | rs -j 0 3
     1   2   3
     4   5   6
     7   8   9
    10
    

    rs不是 Unix 标准工具。但是,它可以广泛使用。它是在 4.2BSD 中发明的,在所有现代 BSD 中也是如此。例如,它可以移植到基于 Linux 的操作系统,例如Debian。

    • 6
  5. roaima
    2020-02-25T08:21:51+08:002020-02-25T08:21:51+08:00

    对于每行输入,这将在 40、80、120 之间交替移动字符串宽度:

    awk '{ m = (NR-1) % 3; i = (m+1) * 40; printf "%*s\n", i, $0 }'
    

    变量:

    • m- 行号模 3(即0, 1,2重复)
    • i- 给定 m 值的缩进

    在没有任何其他指令的情况下,我继续使用您自己的printf格式,以便每一行输入都被格式化为它自己的输出行,并且每一行都将在可用空间中右对齐。

    如果您想要每行三个 40 列条目,如示例中所示,而不是在您的代码中,您可以使用它(如果您想要左对齐文本,请将其更改为)40s:-40s

    awk '{ printf "%40s", $0 } !(NR % 3) { printf "\n" }'
    
    • 4
  6. Praveen Kumar BS
    2020-02-25T23:51:33+08:002020-02-25T23:51:33+08:00

    尝试使用以下命令,测试并运行良好

    命令

    for ((i=0;i<=10;i++)); do awk -v i="$i" 'NR>i && NR<(i+4)' o| perl -pne "s/\n/ /g";echo -e  '\n'; i=$(($i+2)); done
    

    输出

    1 2 3 
    
    4 5 6 
    
    7 8 9 
    
    10 
    
    • 0
  7. Praveen Kumar BS
    2020-02-26T04:16:12+08:002020-02-26T04:16:12+08:00

    使用 Python

    #!/usr/bin/python
    k=open('filename','r')
    p=k.readlines()
    for i in range(0,10,3):
        print str(p[i:i+3]).replace("[","").replace("]","").replace(",","").replace("\\n","").replace("'","")
    

    输出

    1 2 3
    4 5 6
    7 8 9
    10
    
    • 0
  8. WGroleau
    2020-02-26T14:09:20+08:002020-02-26T14:09:20+08:00

    就个人而言,我更喜欢这种格式

    1  4  7
    2  5  8
    3  6  9
    

    这可以通过

    mkdir temp
    cat file | while read FN; do
      touch "temp/$FN"
    done
    ls temp
    

    尽管您可能必须调整窗口宽度以使其成为三列。而且您无法重定向到文件;必须剪切粘贴。重定向告诉ls做单列。

    • -2

相关问题

  • 根据第一个逗号之前的匹配删除重复行数

  • 在另一个文件之后逐行追加行

  • 如何删除两行之间的单行

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

  • 多行文件洗牌

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