【问题标题】:output two commands on same line在同一行输出两个命令
【发布时间】:2015-04-21 08:07:03
【问题描述】:

我已经看过几次这个问题,但我无法解决这个问题。

我有以下命令:

printf '%s\n' "${fa[@]}" | xargs -n 3 bash -c 'cat *-$2.ss | sed -n 11,1p ; echo $0 $1 $2;'

在哪里

printf '%s\n' "${fa[@]}"

O00238 115 03
O00238 126 04

cat *-$2.ss 给出:

   1 D C   0.999  0.000  0.000
   2 L C   0.940  0.034  0.012
   3 H C   0.971  0.005  0.015
   4 P C   0.977  0.005  0.009
   5 T C   0.970  0.009  0.018
   6 L C   0.977  0.006  0.011
   7 P C   0.864  0.027  0.014
   8 P C   0.966  0.018  0.011
   9 L C   0.920  0.038  0.039
  10 K C   0.924  0.043  0.039
  11 D C   0.935  0.036  0.035
  12 R C   0.934  0.023  0.053
  13 D C   0.932  0.022  0.046
  14 F C   0.878  0.041  0.088
  15 V C   0.805  0.031  0.198
  16 D C   0.834  0.039  0.108
  17 G C   0.882  0.019  0.071
  18 P C   0.800  0.031  0.132
  19 I C   0.893  0.039  0.070
  20 H C   0.823  0.024  0.179
  21 H C   0.920  0.026  0.070
  22 R C   0.996  0.001  0.002

运行命令然后产生

  11 D C   0.935  0.036  0.035
O00238 115 03
  11 K C   0.449  0.252  0.270
O00238 126 04

偶数行是sed -n 11,1p的输出,奇数行是echo $0 $1 $2的输出

如何将输出配对在同一行,即

  11 D C   0.935  0.036  0.035 O00238 115 03
  11 K C   0.449  0.252  0.270 O00238 126 04

我试过了:

printf '%s\n' "${fa[@]}" | xargs -n 3 bash -c 'cat *-$2.ss | {sed -n 11,1p ; echo $0 $1 $2;} | tr "\n" " "'

这里建议:Concatenate in bash the output of two commands without newline character

不管怎样

O00238: -c: line 0: syntax error near unexpected token `}'
O00238: -c: line 0: `cat *-$2.ss | {sed -n 11,1p ; echo $0 $1 $2;} | tr "\n" " "'

有什么问题?

【问题讨论】:

  • 原始数组中有什么?也许最好从那里开始,而不是从已有的管道中挑选。
  • 如果您向我们提供原始输入和预期输出,那么我认为这可以在一个命令中完成。
  • 感谢两者 - 添加了printf '%s\n' "${fa[@]}"的输出
  • @brucezepplin 我们还需要知道*-$2.ss 中所有文件的内容(或其中的示例)
  • 这一切都可以在一个简单、清晰的 awk 命令中完成,但我看到您已经选择了一个答案,这会增加您的管道的复杂性,所以如果您想了解如何完成这一切立即发布后续问题。

标签: bash sed echo concatenation


【解决方案1】:

你可以试试这样的:

i=0
for f in *-"$2".ss; do printf '%s %s\n' "$(sed -n '11p' "$f")" "${fa[$((i++))]}"; done

这将遍历您的文件并打印第 11 行以及来自数组 fa 的切片,其索引 i 每次迭代都会增加 1。

【讨论】:

  • @brucezepplin 也更短更高效!
【解决方案2】:

我无法重现您的设置,但是

printf "O00238 115 03\nO00238 126 04" | xargs -n 3 bash -c 'cat test.dat | sed -n 11,1p | tr -d "\n"; echo " $0 $1 $2"'

给予

11 D C   0.935  0.036  0.035 O00238 115 03
11 D C   0.935  0.036  0.035 O00238 126 04

这应该适用于您的情况。我刚刚删除了 sed 命令的换行符。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 2014-09-02
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多