【问题标题】:How do I use awk to generate variables which I can conduct calculations with?如何使用 awk 生成可以进行计算的变量?
【发布时间】:2021-09-11 09:30:19
【问题描述】:

我目前有以下代码,它打印出名为 chimefrbcat1.csv 的 .csv 文件的第 4 列中第 2 行和第 599 行之间的所有值。

#!/bin/bash
awk -F , 'NR >= 2 && NR <= 599 { print NR " " $4 }' chimefrbcat1.csv |
while read -r lineno chimera; do
  echo "chimera on line $lineno is $chimera"
done

但是,我希望代码如下所示:

  1. 获取第 2 行第 4 列和第 7 列中的值
  2. 为每个可用于计算的值生成两个变量
  3. 移至第 3 行并更改两个变量的值

我很确定我需要一个带有counter 变量的“for-loop”,它对应于行,但我不知道如何编写它。

【问题讨论】:

  • { print NR " " $4 " " $7 }read -r lineno col4 col7 会有什么问题?
  • 如果我必须将变量 $col4 和 $col7 ($col4 + $col7) 中的值添加到哪里?
  • 这取决于你想要它的位置。您可以在bash 循环或awk 脚​​本中执行此操作。
  • 无论您以后打算做什么,这都不太可能是一个好的起点。特别是“生成我可以进行计算的变量?”听起来您将尝试使用外壳来完成它不适合做的事情,而您应该在读取输入文件的同一个 awk 脚本中进行所需的任何计算。如果您edit您的问题包括简洁、可测试的样本输入和预期输出(即在那些“计算”之后),那么我们可以帮助您以正确的方式做任何事情。

标签: bash loops csv awk


【解决方案1】:

如果您需要添加第 4 列和第 7 列,您可以在 awk 脚本中完成:

awk -F , 'NR >= 2 && NR <= 599 { print NR " " $4 " " $7 " " $4+$7 }' chimefrbcat1.csv |
while read -r lineno col4 col7 sum; do
    echo "line:$lineno  $col4  +  $col7  =  $sum"
done

或在bash 中使用算术扩展:

awk -F , 'NR >= 2 && NR <= 599 { print NR " " $4 " " $7 }' chimefrbcat1.csv |
while read -r lineno col4 col7; do
    ((sum = col4 + col7))
    echo "line:$lineno  $col4  +  $col7  =  $sum"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多