Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash粘贴命令输出格式_Bash_Paste - Fatal编程技术网

Bash粘贴命令输出格式

Bash粘贴命令输出格式,bash,paste,Bash,Paste,文件1: 文件2: 1 2 文件3: 1 2 3 4 5 粘贴文件1文件2文件2给我一个选项卡分隔的输出: x x x yy yy zz 粘贴-d”文件1文件2文件3为我提供输出: 1 1 2 3 x x x 2 4 5 yy yy zz 我希望它如下所示: 1 1 2 3 x x x 2 4 5 yy yy zz 你知道这是否可行,或者我应该尝试其他命令吗?仅从你的示例来看,你可以尝试先将文件1和2连接起来,然后

文件1:

文件2:

1
2
文件3:

1 2 3
4 5
粘贴文件1文件2文件2
给我一个选项卡分隔的输出:

x x x
yy yy
zz
粘贴-d”文件1文件2文件3
为我提供输出:

1       1 2 3   x x x
2       4 5     yy yy
                zz
我希望它如下所示:

1 1 2 3 x x x
2 4 5 yy yy
  zz

你知道这是否可行,或者我应该尝试其他命令吗?

仅从你的示例来看,你可以尝试先将文件1和2连接起来,然后将其与文件3连接起来,但使用一个特殊的分隔符,稍后将其改为空格

未经测试的示例:

1 1 2 3 x x x
2 4 5   yy yy
        zz
这里我使用了
|
,但您应该使用一些您确信不会出现在数据中的东西,即一些更模糊的东西,如
˘
。有点像黑客,但应该有用

仅针对两个文件:

paste -d" " file1 file2 | paste -d'|' - file3 | sed 's,|, ,g'

可以使用sed after删除选项卡

paste -d'¤' file1 file2 | sed 's,¤, ,g'
这是一个通用的awk脚本,它可以处理任意数量的文件和任何格式

 paste file file2 file3 | sed 's/\t/ /'

 1 1 2 3 x x x
 2 4 5   yy yy
         zz
awk'
{x=argid;a[x]=a[x]>(b=length($0))?a[x]:b}
{F[FNR,x]=$0}
结束{

对于(q=1;q这就是你要找的那种东西吗

awk '
    {x=ARGIND;a[x]=a[x]>(b=length($0))?a[x]:b}
    {F[FNR,x]=$0}
    END{
            for(q=1;q<=FNR;q++)
            {
                    for(i=1;i<=ARGC;i++)
                    {
                    printf( "%-"a[i]"s ",F[q,i])
                    }print ""
            }
    }' file{1,2,3,4)

粘贴
两次对我来说:

$ more file{1,2,3,4} | cat
::::::::::::::
file1
::::::::::::::
1
2
::::::::::::::
file2
::::::::::::::
1 2 3
4 5 6 7 8
::::::::::::::
file3
::::::::::::::
x x x
yy yy
zz
::::::::::::::
file4
::::::::::::::
a a a
bb bb bb
c c cc
d d d
$ paste file{1,2,3,4} | sed -e 's/\t/ \t/g' | column -t -s$'\t'
1   1 2 3       x x x   a a a
2   4 5 6 7 8   yy yy   bb bb bb
                zz      c c cc
                        d d d

$paste实际上,我正在生成paste命令,并将其分配给变量pasecmd,并将其作为${pasecmd}执行,因此此方法不适合我。可以有任意数量的文件,也可以至少有一个。没有太大的障碍,只需生成获取两个文件的命令,然后遍历所有文件。如果确实需要,所有这些代码和数据都可以包含在同一个变量中。但这已经是一个不同的问题。我尝试过了,但我还有另一个问题现在问题。当我使用语法${pastecmd}执行生成的命令时,粘贴命令认为|是另一个输入文件。我试图将其转义,但没有成功。我更愿意探索粘贴命令标志,看看这是否可以实现。感谢您的时间。尝试使用不同的分隔符,如第二个示例中所示。您在问题中没有提到在变量中保存代码,因此|是一个糟糕的默认值。不幸的是,“粘贴”没有其他有用的标志。@Ramesh不在变量中存储命令。使用数组。有关详细信息,请参阅。也就是说,您仍然无法在其中粘贴管道,因为这仍然不起作用。如果文件在EOL处有制表符呢?不,使用未使用的分隔符将保持框状水平堆叠。@Jidder,是的,这是我想要的。事实上,我尝试用空格代替制表符,但使用了“g”最后的标志,这弄乱了我的输出。我现在正在使用你的解决方案。谢谢。@Ramesh sed命令只有在前两个文件行的长度加起来为8时才有效,因为它仍然有一个选项卡。awk解决方案更耐用。如果fedorquis answer适用于不同长度的行/文件,我建议接受他的。我不知道ink我完全理解您对选项卡的看法,但是,当我尝试打开生成的输出文件(扩展名为.csv)时在电子表格应用程序中,我必须同时使用制表符和空格作为字段分隔符;仅使用空格作为字段分隔符并不能将所有列放在适当的单元格中,我认为这与您所说的有关。我将尝试使用fedorqui的解决方案来处理不同的输入文件,并使用他的解决方案,如果它适用于所有输入文件案例。如果
file2
的第二行是
45 6 7 8
,那该怎么办?那么所需的输出是什么?这里的目标是每个输入文件都有一列吗?目标是使用空格作为分隔符,并且仍然保持每个文件中的原始格式。对不起,我没有得到您关于file2的问题。那么您的问题解决了吗?还没有解决不,我需要将每个文件之间的制表符转换为一个空格。我想,我可以通过使用不带任何标志的粘贴命令获得与您类似的输出。这对更多文件或不同长度的行如何工作?应该研究一下,但这不在问题的范围之内。很高兴您能够在你的答案中加上红色,但我认为没有必要概括所有的答案:D
$ paste <(paste -d" " f1 f2) f3
1 1 2 3 x x x
2 4 5   yy yy
        zz