如何使用awk在循环中打印列?

Qia*_* Xu 3 shell awk ksh

我有一个命令的多列文本输出,并希望一次打印一列,如:

#!/usr/bin/ksh

typeset -i i=0
while [[ $i -lt 5 ]]; do
  <command 1> |awk '{print $i}' |<command 2>
  i=$i+1
done
Run Code Online (Sandbox Code Playgroud)

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

比如,输出来自command 1:

"abc" "def" "ghi" "jkm"
"123" "456" "789" "0ab"
"erf" "fad" "dae" "kjh"
Run Code Online (Sandbox Code Playgroud)

该值不一定是3个字符长.这只是一个例子.

我希望依次将第1列放到第4列,供我们使用command 2.

Chr*_*our 6

$i在shell变量和$i第i 字段之间感到困惑awk.您需要将shell变量的值传递给awkin in using -v:

#!/bin/bash

for i in {1..5}; do 
    <command1> | awk -v i="$i" '{print $i}' | <command2>
done
Run Code Online (Sandbox Code Playgroud)

这将分别command2处理输出中的每一列command1.


Ken*_*ent 5

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

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

OUT1=$(command1||awk '{for (i=1;i<=4;i++)print $i}')
Run Code Online (Sandbox Code Playgroud)

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

"abc"
"def"
"ghi"
"jkm"
"123"
"456"
"789"
"0ab"
"erf"
"fad"
"dae"
"kjh"
Run Code Online (Sandbox Code Playgroud)

然后你可以$OUT1使用循环或其他任何方式处理变量.

也可以调用command2awk内部.这取决于要求.如果你不想捕获cmd2的输出,你可以这样做:

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

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