【问题标题】:Bash: piping STDOUT to pasteBash:管道 STDOUT 粘贴
【发布时间】:2013-09-09 15:08:45
【问题描述】:

不要这样做:

$ 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 中一系列操作的输出左侧,然后继续执行一些操作。

【问题讨论】:

  • 一个命令?您正在使用 pastecat、2 x perlsed,这是 5 个子进程。最好在一个 perl 脚​​本中完成所有操作。

标签: bash stdout stdin paste


【解决方案1】:

你似乎在寻找Command Substitution

例如,您的 second 命令可以重写为:

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

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

【讨论】:

  • 这正是我想要的。我认为 Bash 具有允许此类事情的功能,但我不知道它叫什么。谢谢!
  • 呃,除了我收到一个错误,因为 paste 无法解析这个。哦,好吧。
【解决方案2】:

也许你想重定向输出。

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

#!/bin/bash

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

[do some things]

exec >&4- # Put it back.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多