Bash:将STDOUT用于粘贴

时间:2013-09-09 15:08:45

标签: bash stdout stdin paste

而不是这样做:

$ cat input.txt |
  perl -anF'\t|\n' \
       -e'$n=@F-1if!$n;for(0..$n){push@{$$m[$_]},$F[$_]}'\'END{print map{join"\t",@$_,"\n"}@$m}' > output.txt

$ paste -d"\t" paste.file.txt output.txt |
  perl -ne '{while (<>) {$line = $_; $line =~ s/\t/,/g; print "$line";}}' |
  sed 's/\"//g' > comma.delimited.output.csv

我想做更像这样的事情,所有操作都在一个命令中完成:

$ paste -d"\t" paste.file.txt [[
    cat input.txt |
    perl -anF'\t|\n' -e'$n=@F-1if!$n;for(0..$n){push@{$$m[$_]},$F[$_]}'\'END{print map{join"\t",@$_,"\n"}@$m}'
  ]] |
  perl -ne '{while (<>) {$line = $_; $line =~ s/\t/,/g; print "$line";}}' |
  sed 's/\"//g' > comma.delimited.output.csv

基本上我想将一个文件粘贴到Bash中一系列操作输出的左侧,然后继续执行一些操作。

2 个答案:

答案 0 :(得分:1)

您似乎在寻找Command Substitution

例如,您的第二个命令可以重写为:

paste -d"\t" paste.file.txt $(perl -anF'\t|\n' -e'$n=@F-1if!$n;for(0..$n){push@{$$m[$_]},$F[$_]}' 'END{print map{join"\t",@$_,"\n"}@$m}' input.txt) | perl -ne '{while (<>) {$line = $_; $line =~ s/\t/,/g; print "$line";}}' | sed 's/\"//g' > comma.delimited.output.csv

这将消除处理临时文件的需要。

答案 1 :(得分:0)

也许你想重定向输出。

您可以在bash脚本中执行此操作。

#!/bin/bash

exec 4>&1 > >(exec tee >(exec paste ... > output_file))

[do some things]

exec >&4- # Put it back.