我有一些命令的多列文本输出,并希望一次打印一列,如:
#!/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
使用。
答案 0 :(得分:6)
$i
$i
shell变量与awk
中awk
i th 字段之间的混淆。您需要使用-v
:
#!/bin/bash
for i in {1..5}; do
<command1> | awk -v i="$i" '{print $i}' | <command2>
done
command2
这将允许command1
分别处理{{1}}输出中的每一列。
答案 1 :(得分:5)
我不会在你的问题中做循环。因为,这将执行相同的命令(command 1
) n 次(在您的示例中 12 次),仅用于提取值。如果command 1
很贵,那么您的脚本会很慢。即使它不贵,也不是好的做法,我们不应该这样做。
我建议您只执行一次cmd1,然后将其输出转换为格式,这很容易传递给commnd2。例如:
OUT1=$(command1||awk '{for (i=1;i<=4;i++)print $i}')
这会将输出转换为一行中的每个col,例如:
"abc"
"def"
"ghi"
"jkm"
"123"
"456"
"789"
"0ab"
"erf"
"fad"
"dae"
"kjh"
然后你可以使用循环或其他任何方式处理变量$OUT1
。
也可以在awk中调用command2
。这取决于要求。如果你不想捕获cmd2的输出,你可以这样做:
$(command1||awk '{for (i=1;i<=4;i++)system("command2 "$i)}')
但同样,这取决于你的逻辑/要求。