将awk输出存储在变量中

时间:2016-06-22 14:50:56

标签: linux bash shell awk

我忽略了这段代码的问题是什么?

#! /bin/bash
File1=$1
for (( j=1; j<=3; j++ ))
{
    output=$(`awk -F; 'NR=='$j'{print $3}' "${File1}"`)
    echo ${output}
}

File1看起来像这样:

Char1;2;3;89
char2;9;6;66
char5;3;77;8

我想在每一行上提取字段3

所以结果将是

3
6
7

4 个答案:

答案 0 :(得分:5)

应该是这样的:

#! /bin/bash
File1=$1
for (( j=1; j<=3; j++ ))
{
                output=$(awk -F ';' 'NR=='$j' {print $3}' "${File1}")
                echo ${output}
}

它在我的CentOS上运行良好。

答案 1 :(得分:1)

  1. 你在整个地方混合使用单引号和反引号而不是逃避它们
  2. 您无法在不使用-v标记的情况下在awk脚本中使用bash变量
  3. awk已经在循环中工作,所以没有理由循环循环......
  4. 只需:

    awk -F";" '{print $3}' "${file1}"
    

    将完全执行您的整个脚本现在尝试执行的操作。

答案 2 :(得分:1)

更简单,使用cut实用程序:cut -d';' -f3将生成您要查找的结果,其中-d指定要使用的分隔符,-f字段/您正在寻找的列(1索引)。

答案 3 :(得分:1)

如果您只是想从结构化文件中提取一个列,请使用cut实用程序。

cut将允许您指定数据中的分隔符(;)以及您要提取的列(第3列)。

cut -d';' -f3 "$file1"

如果您希望循环显示结果,请逐个使用while循环和read值:

cut -d';' -f3 "$file1" |
while read data; do
  echo "data is $data"
done

您是否需要变量中的值,请执行此操作

var=$( cut -d';' -f3 "$file1" | tr '\n' ' ' )

tr '\n' ' '位用空格替换换行符,因此您可以将3 6 77作为字符串。

让他们进入一个阵列:

declare -a var=( $( cut -d';' -f3 "$file1" ) )

(此处不需要tr

然后,您可以访问${var[0]}${var[1]}等值。