csv 如何在bash中重定向多列输出?

mi7gmzs6  于 2023-05-11  发布在  其他
关注(0)|答案(3)|浏览(125)

我在终端上运行了多次测试,并将输出重定向到一个文件。而重定向我希望每个运行作为一个单独的列。目前,我可以获得以下内容:

Run1
1
2
3
4
Run2
1
2
3
4

如何将其重定向如下:

Run1  Run2
1      1
2      2
3      3
4      4
ldioqlga

ldioqlga1#

pr

pr -2 -t -s file

或者来自stdin:

cat file | pr -2 -t -s

输出:

Run1    Run2
1       1
2       2
3       3
4       4

参见:man pr

mrphzbgm

mrphzbgm2#

如果command1生成Run1,command2生成Run2

paste <(command1) <(command2) | column -s $'\t' -tne

将把输出连接到列中。
下面是一个使用愚蠢命令的示例

# paste <(ls -1 /var/log/*log) <(ls -1 /var/log/*/*_log) | column -s $'\t' -tne
/var/log/alternatives.log  /var/log/cups/access_log
/var/log/auth.log          /var/log/cups/error_log
/var/log/boot.log          /var/log/cups/page_log
/var/log/bootstrap.log     
/var/log/daemon.log        
/var/log/dpkg.log          
/var/log/faillog           
/var/log/fontconfig.log    
/var/log/kern.log          
/var/log/lastlog           
/var/log/pm-powersave.log  
/var/log/pm-suspend.log    
/var/log/pycentral.log     
/var/log/syslog            
/var/log/user.log          
/var/log/vbox-install.log  
/var/log/wvdialconf.log    
/var/log/Xorg.0.log        
/var/log/Xorg.1.log        
/var/log/Xorg.2.log

参考:https://sleeplessbeastie.eu/2018/11/19/how-to-display-output-of-multiple-commands-using-columns/
如果你想显示并重定向到一个文件,每个command都可以包含一个tee来完成这个任务。
最好包含您自己的命令(或虚拟命令),这样我们就可以给予您一个更具体的答案。

xqkwcwgp

xqkwcwgp3#

虽然pr的公认解决方案非常优雅,但它有一个问题,类似于paste的问题:如果不同行的长度大于8(制表符的默认空格大小),则输出行被替换。线的长度差异越大,输出越混乱。
不幸的是,我没有找到比使用一个小的awk脚本更健壮的方法,当然可以将其放在一个单独的文件中以供重用。
如果你有一个这样的文件(lipsum.txt):

$ cat lipsum.txt
Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. 
Cras hendrerit scelerisque sollicitudin. 
In at mauris cursus, 
varius eros ut, 
dignissim urna. 
Nullam est orci, 
molestie sit amet risus in, 
commodo dignissim justo. 
Morbi eu enim leo. 
Proin pulvinar consectetur elit, 
in viverra nisl ultrices quis. 
Vivamus ac lacus eget urna auctor finibus. 
Suspendisse potenti. 
Vestibulum sed ligula nisl.

可接受的解决方案将产生如下结果:

$ cat lipsum.txt | pr -2 -t -s
Lorem ipsum dolor sit amet,     commodo dignissim justo.
consectetur adipiscing elit.    Morbi eu enim leo.
Cras hendrerit scelerisque sollicitudin.    Proin pulvinar consectetur elit,
In at mauris cursus,    in viverra nisl ultrices quis.
varius eros ut,     Vivamus ac lacus eget urna auctor finibus.
dignissim urna.     Suspendisse potenti.
Nullam est orci,    Vestibulum sed ligula nisl.
molestie sit amet risus in,

使用下面的(长)一行,您可以在测量长度时将所有行保存在一个数组中,然后再次以两列显示它们,并使用适当的宽度(设置为最大值)。线的长度)。

$ cat lipsum.txt |awk 'BEGIN{w=0;}{lines[NR]=$0;l=length($0);w=l>w?l:w;}END{wd=W>0?W:w;h=rshift(NR,1)+(NR%2);for (i=1;i<=h;i++){printf "%*s %s %*s\n",-wd,lines[i],sep,-wd,lines[i+h];}}'
Lorem ipsum dolor sit amet,                  commodo dignissim justo.                   
consectetur adipiscing elit.                 Morbi eu enim leo.                         
Cras hendrerit scelerisque sollicitudin.     Proin pulvinar consectetur elit,           
In at mauris cursus,                         in viverra nisl ultrices quis.             
varius eros ut,                              Vivamus ac lacus eget urna auctor finibus. 
dignissim urna.                              Suspendisse potenti.                       
Nullam est orci,                             Vestibulum sed ligula nisl.                
molestie sit amet risus in,

您甚至可以使用变量sep设置字符串分隔符,并使用变量W设置列的宽度(如果它小于max。行长度,您将获得类似于pastepr的效果,当然):

$ cat lipsum.txt |awk -v W=50 -v sep='|:|' 'BEGIN{w=0;}{lines[NR]=$0;l=length($0);w=l>w?l:w;}END{wd=W>0?W:w;h=rshift(NR,1)+(NR%2);for (i=1;i<=h;i++){printf "%*s %s %*s\n",-wd,lines[i],sep,-wd,lines[i+h];}}'
Lorem ipsum dolor sit amet,                        |:| commodo dignissim justo.                          
consectetur adipiscing elit.                       |:| Morbi eu enim leo.                                
Cras hendrerit scelerisque sollicitudin.           |:| Proin pulvinar consectetur elit,                  
In at mauris cursus,                               |:| in viverra nisl ultrices quis.                    
varius eros ut,                                    |:| Vivamus ac lacus eget urna auctor finibus.        
dignissim urna.                                    |:| Suspendisse potenti.                              
Nullam est orci,                                   |:| Vestibulum sed ligula nisl.                       
molestie sit amet risus in,                        |:|

相关问题