3

我有一些命令的多列文本输出,并且想一次打印一列,例如:

#!/usr/bin/ksh

typeset -i i=0
while [[ $i -lt 5 ]]; do
  <command 1> |awk '{print $i}' |<command 2>
  i=$i+1
done

我知道$i这不是在 awk 中指定第 i 列的方法。这里的正确用法是什么?

说,输出command 1是这样的:

"abc" "def" "ghi" "jkm"
"123" "456" "789" "0ab"
"erf" "fad" "dae" "kjh"

该值不一定是 3 个字符长。这里只是举例。

我想依次将第 1 列到第 4 列,供command 2.

4

2 回答 2

6

您在$ishell变量和. 您需要将 shell 变量的值传递给in using :$iawkawk-v

#!/bin/bash

for i in {1..5}; do 
    <command1> | awk -v i="$i" '{print $i}' | <command2>
done

这将允许command2分别处理来自输出的每一列command1

于 2013-04-29T13:48:12.987 回答
4

我不会在你的问题中循环。因为,这将执行相同的命令 ( command 1) n次(在您的示例中为12次),仅用于提取值。如果command 1价格昂贵,您的脚本会很慢。即使它不贵,也不是好的做法,我们不应该那样做。

我建议您只执行一次 cmd1,然后将其输出转换为易于传递给 commnd2 的格式。例如:

OUT1=$(command1||awk '{for (i=1;i<=4;i++)print $i}')

这会将输出转换为一行中的每个列,例如:

"abc"
"def"
"ghi"
"jkm"
"123"
"456"
"789"
"0ab"
"erf"
"fad"
"dae"
"kjh"

然后您可以$OUT1使用循环或其他方式处理变量。

也可以调用command2inside awk。这取决于要求。如果您不想捕获 cmd2 的输出,可以执行以下操作:

$(command1||awk '{for (i=1;i<=4;i++)system("command2 "$i)}')

但同样,这取决于您的逻辑/要求。

于 2013-04-29T14:16:31.493 回答