Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/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_Shell - Fatal编程技术网

Bash 当输入来自管道时,按列获取粘贴到输出

Bash 当输入来自管道时,按列获取粘贴到输出,bash,shell,Bash,Shell,我有一个程序,在bash的for循环中处理大量数据文件。目前,我需要将每个循环步骤输出到一个单独的文件中,然后在最后再次处理所有这些文件,以便将它们制成表格。我希望避免通过文件来实现这一点,并使用基本的shell命令来实现这一点。这似乎是可能的,但我遇到了麻烦。以下是一个示例,说明了大致的过程: #create some example data seq 1 100 > results-all split -l 10 -d -a 1 results-all results- #proces

我有一个程序,在bash的for循环中处理大量数据文件。目前,我需要将每个循环步骤输出到一个单独的文件中,然后在最后再次处理所有这些文件,以便将它们制成表格。我希望避免通过文件来实现这一点,并使用基本的shell命令来实现这一点。这似乎是可能的,但我遇到了麻烦。以下是一个示例,说明了大致的过程:

#create some example data
seq 1 100 > results-all
split -l 10 -d -a 1 results-all results-
#process the data
for RESULT in `seq 0 9`; do tail -n-5 results-$RESULT > results-clean-$RESULT; done; paste results-clean-{0..9}
请记住,这是一个例子,事实上,我正在对这些输入文件进行更多的处理,因此将该步骤移到其他地方/以某种方式删除的过于简单的解决方案在实践中不太可能起作用(这只是一个例子)。当我试图更改此代码以删除通过文件的中间步骤时,我失去了将输入格式化为列的粘贴功能。因此:

for RESULT in `seq 0 9`; do tail -n-5 results-$RESULT; done | paste - - - - - - - - - -
现在,输出是按行而不是按列。我可以转置这些数据,但似乎没有一个shell工具可以做到这一点。我可以编写代码对其进行转置(或者从堆栈溢出复制一个示例来进行转置),但似乎应该有一种方法可以做到这一点,而不必求助于此


非常感谢您的帮助。

也许您可以使用
粘贴的
-s
选项

呃。。。不,不行。我们有
实用程序:

for RESULT in `seq 0 9`; do tail -n-5 results-$RESULT; done | column -c100
但有趣的是,输出的列数或列数是由当前的终端宽度控制的!:-/

编辑
column-c100
对我来说可以产生所需的输出,但我想这也取决于系统上标准表格的长度

编辑2 好的,那么OP想要的是
列的行为
,通过该行为,一个cat以行数告诉它输出矩阵的高度,而不管终端的大小。我在
中添加了
-h numrows
选项,原始的
来自BDSutils(我的Debian上的数据包bsdmainutils

请找到。使用以下工具进行简单编译:

cc -o column column.c
然后运行:

for RESULT in `seq 0 9`; do tail -n-5 results-$RESULT; done | /path/to/new/column -h5

获取高度为5的列。此选项与在另一个方向(即按行)填充矩阵的
-x
标志兼容。

此处的解决方案是对输入使用读取和多个文件描述符

编辑:我找到了一种自动分配文件描述符的方法:在exec中保存这些描述符

for FDNR in `seq 0 9`; do eval exec "{fd$FDNR}<results-$FDNR"; done
while read -u $fd0 FILELINE ; do 
   echo -n $FILELINE
   for FDNR in `seq 1 9`; do 
       otherfd=fd$FDNR
       read -u ${!otherfd} FILELINE; 
       echo -n -e \\t$FILELINE
   done 
   echo
done 
for FDNR in `seq 0 9`; do eval exec "{fd$FDNR}<&-"; done

用于'seq 0 9'中的FDNR;do eval exec“{fd$FDNR}paste-s results clean-{0..9}将执行与上述类似的操作。在stdinput上调用时,它只会在一行中消耗整个流。我尝试了带有各种参数的列(我认为几乎所有排列…),但无法让它执行此操作。也许我遗漏了什么?对我来说,-c“用于控制显示列的param只是将其设置为一列(除非我没有设置它,在这种情况下,输出与您所说的显示宽度类似)。是的,如果您不想使用中间文件,使用
粘贴
不是正确的解决方案,因为stdinput只是一个大的“列”。您必须使用
实用程序,请参阅我的上一次编辑。@扣篮关于上一次注释:您作为-c选项参数给出的整数是一个以字符数表示的宽度,而不是以列数表示的宽度。这似乎是可行的,尽管它当然对数据的宽度非常敏感,这不是一件容易控制的事情:-/。例如,即使显示所有数据,也会杀死它:因为结果是
seq 0 9
;执行cat结果-$RESULT;完成| column-c 100I如果要编写代码,只需编写矩阵转置就更容易了。看起来这应该是可以解决的,不需要使用定制脚本。
是正确的工具,但不幸的是,它是用以终端为中心的观点编写的,目的是为给定的终端提供最佳的列输出。我只是添加了相关的选项,几分钟后会在这里发布新的答案。。。