Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 如何使sed输出并排进行?_Bash_Sed_Side By Side - Fatal编程技术网

Bash 如何使sed输出并排进行?

Bash 如何使sed输出并排进行?,bash,sed,side-by-side,Bash,Sed,Side By Side,我想要一个基因的KEGG通路的标准输出并排放置,不管它有多少条KEGG通路。例如,基因TT123456涉及多种途径: Valine, leucine and isoleucine degradation Histidine metabolism Ascorbate and aldarate metabolism Lysine degradation Glycerolipid metabolism 通过使用sed命令 sed '$!N;s/\n/\t/' 我能把两条线并排连接起来 Valine

我想要一个基因的KEGG通路的标准输出并排放置,不管它有多少条KEGG通路。例如,基因TT123456涉及多种途径:

Valine, leucine and isoleucine degradation
Histidine metabolism
Ascorbate and aldarate metabolism
Lysine degradation
Glycerolipid metabolism
通过使用sed命令

sed '$!N;s/\n/\t/'
我能把两条线并排连接起来

Valine, leucine and isoleucine degradation  Histidine metabolism
Ascorbate and aldarate metabolism   Lysine degradation
Glycerolipid metabolism
但是,我希望输出为

Valine, leucine and isoleucine degradation  Histidine metabolism    Ascorbate and aldarate metabolism   Lysine degradation  Glycerolipid metabolism
我一直在四处寻找,但是,我没有找到一个好的解决办法

社区能否与我分享你的专业知识


谢谢。

您可以使用
tr

tr '\n' '\t' < inputfile
使用sed:

sed '$!{:a;N;s/\n/\t/;ta}' inputfile

您可以像这样使用
xargs

$ xargs -n15 <file
Valine, leucine and isoleucine degradation Histidine metabolism Ascorbate and aldarate metabolism Lysine degradation Glycerolipid metabolism

$xargs-n15使用
awk

awk 'ORS="\t"' file
如果您希望使用
sed
,则:

$ sed ':a;N;s/\n/\t/;ba' file
Valine, leucine and isoleucine degradation      Histidine metabolism    Ascorbate and aldarate metabolism       Lysine degradation      Glycerolipid metabolism
这才是真正的目的:

以下是手册页上所说的
-s
标志应该做的事情:

在命令中连接每个单独输入文件的所有行 排队。每行的
,每行中最后一行除外 除非另有说明,否则输入文件应替换为
由-d选项指定

您还可以使用
-
而不是文件名来处理标准输入

somecommand | paste -s -

tr'\n'\t'
paste-s
(带有隐含的制表符分隔符)之间有什么区别?前者甚至会去除尾随的换行符,但粘贴后的换行符将保持不变。另外,
paste
可以处理标准输入和文件,但
tr
只能处理标准输入。

您可以在串行模式下使用粘贴:

paste -s file

另外
printf'%s'$(
printf'%s'$(cat file)
如果您的shell没有
$(<…)

请查看以区分
tr'\n'\t'
paste-s
@kojiro我理解
tr
paste
之间的区别。你的便条似乎表明它有问题。如果是这样的话,请指出并随意否决。使用
tr
没有错,但我觉得区分很重要。我最初在我的评论中描述了差异,但后来决定最好将其放在我的答案中。@kojiro那么对不同答案进行比较分析是你的爱好吗?@KJLim除非它是文件中的最后一行,否则它会将下一行与模式空间连接起来,用制表符替换换行符并再次循环。感谢您的输入。它确实非常有用。+1,因为它不会在输出的末尾生成一个无关的选项卡。(因为shell允许您将stdin重定向到一个文件,所以我看不到“粘贴可以处理标准输入和文件”的附加值。)@rici如果您不想使用标准输入,例如在读取循环中或在将命令传输到ssh时,它会很有用。@kojiro:
tr非常感谢。如果可以的话,你能解释一下吗;Ns/\n/\t/;还有吗?谢谢您的方法有效。@KJLim
a
是标签,
N
是用
\N
抓住下一行。我们使用普通替换将换行符替换为制表符<代码>:ba
是关键部分,它允许您循环回标签以继续此替换,直到文件结束。感谢您的输入。
$ paste -s "$file"
Valine, leucine and isoleucine degradation  Histidine metabolism    Ascorbate and aldarate metabolism   Lysine degradation  Glycerolipid metabolism
somecommand | paste -s -
paste -s file