Shell,列-t,将第N个空格后的所有内容视为最后一列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell,列-t,将第N个空格后的所有内容视为最后一列相关的知识,希望对你有一定的参考价值。

我想打印一个两列表。在第一列中是路径(没有空格),在第二列中是名称(带空格)。我想让column将第N个空格(N = 2)之后的所有内容视为属于单个列。

我不需要使用column,但我想要一些简短的东西。注意:我不是在寻找其他只需要两列的解决方案。

mark@localhost ~/.config/chromium/Default/Extensions
% for f in */*/manifest.json; do
    echo -n "$f ";
    cat $f | jq -r '.name + " " + .version';
done | column -t
cjpalhdlnbpafiamejdnhcphjbkeiagm/1.14.22_0/manifest.json     uBlock                  Origin      1.14.22          
dbepggeogbaibhgnhhndojpepiihcmeb/1.62.4_0/manifest.json      Vimium                  1.62.4                       
dffhipnliikkblkhpjapbecpmoilcama/0.3_0/manifest.json         Swap                    My          Cookies  0.3     
gcbommkclmclpchllfjekcdonpmejbdp/2017.12.6_0/manifest.json   __MSG_about_ext_name__  2017.12.6                    
gdbofhhdmcladcmmfjolgndfkpobecpg/4.19_0/manifest.json        Don't                   track       me       Google  4.19
pkehgijcmpdhfbdbbnkijodmdjhbjlgp/2017.11.20_0/manifest.json  __MSG_name__            2017.11.20                   
答案

获取一些command(可能是你的循环)的输出,并将前两个空格后的所有内容格式化为一列的一部分:

command | sed 's/ /\t/g; s/\t/ /2; s/\t/ /1' input | column -ts' ' | sed 's/\t/ /g'

例如,将此文件视为输入:

$ cat input
c1 c2 Eric Clapton
column1 column2 David Crosby
very-long-first-column 2nd Jimi Hendrix Jr

我们可以通过以下方式生成您想要

$ sed 's/ /\t/g; s/\t/ /2; s/\t/ /1' input | column -ts' ' | sed 's/\t/ /g'
c1                      c2       Eric Clapton
column1                 column2  David Crosby
very-long-first-column  2nd      Jimi Hendrix Jr

How it works

我们分三个步骤处理文本:

  1. sed 's/ /\t/g; s/\t/ /2; s/\t/ /1' 这将使用制表符替换除前两个之外的所有空格。
  2. column -ts' ' 这会执行column -t格式化,但仅将其应用于空格分隔的字段。
  3. sed 's/\t/ /g' 这会将第三列中的选项卡转换回空白。

Shell function for ease-of-use

首先,定义:

format() { sed 's/ /\t/g; s/\t/ /2; s/\t/ /1' "$@" | column -ts' ' | sed 's/\t/ /g'; }

现在,我们可以以快速简单的方式应用格式,作为管道的一部分:

$ cat input | format
c1                      c2       Eric Clapton
column1                 column2  David Crosby
very-long-first-column  2nd      Jimi Hendrix Jr

或者,对文件进行操作:

$ format input
c1                      c2       Eric Clapton
column1                 column2  David Crosby
very-long-first-column  2nd      Jimi Hendrix Jr

要使format的定义永久化,请将其放在~/.bashrc文件中。

Formatting for N number of columns

让我们定义一个允许我们指定列数的函数:

frmt() { [[ $1 =~ ^[0-9]+$ ]] && sed "s/ /\t/$1g" "${@:2}" | column -ts' ' | sed 's/\t/ /g'; }

我们可以格式化两列文件:

$ frmt 2 input
c1                      c2 Eric Clapton
column1                 column2 David Crosby
very-long-first-column  2nd Jimi Hendrix Jr

或3列:

$ frmt 3 input
c1                      c2       Eric Clapton
column1                 column2  David Crosby
very-long-first-column  2nd      Jimi Hendrix Jr

我们可以使用相同的函数作为管道的一部分:

$ cat input | frmt 3
c1                      c2       Eric Clapton
column1                 column2  David Crosby
very-long-first-column  2nd      Jimi Hendrix Jr

这种方法使用GNU sed,因此可以在Linux上运行,包括ArchLinux,但不适用于OSX / BSD系统。

另一答案

你可以试试

command | sed 's/[^ ]*/&\t/' | column -ts $'\t'

以上是关于Shell,列-t,将第N个空格后的所有内容视为最后一列的主要内容,如果未能解决你的问题,请参考以下文章

矩形交换行

Linux variable parameters EXplain(Linux 变量参数说明)

每天练习50个shell

shell学习- sort

将一列分成两列的更新?

shell基础知识总结