簡體   English   中英

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

[英]How to use awk to print columns in a loop?

我有一個命令的多列文本輸出,並希望一次打印一列,如:

#!/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

你在$i shell變量和$iawk i 字段之間感到困惑。 你需要在使用-v將shell變量的值傳遞給awk

#!/bin/bash

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

這將讓command2處理command1輸出中的每一列。

我不會在你的問題中做循環。 因為,這將執行相同的命令( command 1n次(在您的示例中為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)}')

但同樣,這取決於您的邏輯/要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM