【问题标题】:store awk output in variable将 awk 输出存储在变量中
【发布时间】:2026-01-03 22:30:01
【问题描述】:

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

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

【问题讨论】:

  • 去掉单引号并转义分号:output=$(awk -F\; 'NR=='$j'{print $3}' "${File1}").
  • 你试过了吗?
  • 通过阅读您的代码,我无法理解您想要做什么。您只想提取前 3 行吗?如果您已经使用过 awk,为什么还需要 shell for 循环?
  • 你有反引号 inside $( ... )。那是错误的。这将尝试执行从内部反引号返回的内容。
  • @gniourf_gniourf YES 但它给了我这个日志错误:./script.sh: line 8: NR==1{print $3}: command not found 你知道吗?

标签: linux bash shell awk


【解决方案1】:

应该是这样的:

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

它在我的 CentOS 上运行良好。

【讨论】:

  • @technopathe awk -F ';' '{print $3}' file 在没有 for 的情况下也会做同样的事情。 :)
【解决方案2】:
  1. 您到处混用单引号和反引号,而不是转义它们
  2. 如果不使用 -v 标志,则不能在 awk 脚本中使用 bash 变量
  3. awk 已经在循环中工作,所以没有理由循环循环...

只是:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您只是想从结构化文件中提取一列,例如您拥有的文件,请使用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]} 等方式访问这些值。

      【讨论】:

        最近更新 更多