【问题标题】:passing a parameter in awk command won't work在 awk 命令中传递参数不起作用
【发布时间】:2016-11-10 16:01:20
【问题描述】:

我使用./command script.sh 11 运行下面的脚本,下面的第一行代码成功地将输出(321)存储在参数 x 中(使用第 2 行的 echo 检查)。在第 3 行,我尝试使用参数 x 来检索所有行的最后两列,其中第一列中的值等于 x(在 doc2.csv 中)。这行不通,但是当我将z=$x 替换为z=321 时,它可以正常工作。为什么传递参数时这段代码不起作用?

#!/bin/bash
x="$(awk -v y=$1  -F\; '$1 == y' ~/Documents/doc1.csv | cut -d ';' -f2)"
echo $x
awk -v z=$x -F, '$1 == z' ~/Documents/doc2.csv | cut -d ',' -f2,3

doc1.csv(所有列都有唯一值)

33;987
22;654
11;321
...

doc2.csv

321,156843,ABCD
321,637253,HYEB
123,256843,BHJN
412,486522,HDBC
412,257843,BHJN
862,256843,BHLN
...

【问题讨论】:

  • 你为什么使用cut?在awk中输出你想要的列:'$1 == y { print $2 }'
  • 您的 CSV 文件是否使用 DOS 行尾?
  • 您几乎可以肯定在第一个文件的每一行末尾都有某种空白,所以x 不是321 它的321<white space> 并且正如@chepner 所说,这很可能是控制-Ms 所以首先在文件上运行 dos2unix 或类似的。此外,当您使用 awk 时,您永远不需要 cut 或 grep 或 sed 或任何其他小工具。阅读 Arnold Robbins 所著的 Effective Awk 编程,第 4 版。
  • 问题确实是由dos行尾引起的

标签: bash awk terminal


【解决方案1】:

就像其他人提到的那样,可能会有一些额外的角色出现在你的 cut 命令的字段 2 中。

如果您只是使用 awk 来打印您想要的列而不是整行并切割您不应该有任何问题。如果您仍然这样做,那么您需要查看dos2unix

n=33;
x=$(awk -v y=$n  -F\; '$1 == y {print $2}' d1);
echo ${x};
awk -v z=$x -F, '$1 == z' d2

d1d2 包含您概述的 doc1 和 doc2 内容。

正如你所看到的,我所做的只是停止在 awk 的输出上使用 cut 并告诉 awk 如果第一个字段等于输入变量,则打印第二个字段。

顺便说一句,如果你不知道的话,awk 是相当强大的……你可以在 awk 中完成整个程序。

n=11; awk -v x=$n -F\; 'NR==FNR{ if($1==x){ y[$2]; } next}  $1 in y{print $2, $3}' d1 <( sed 's/,/;/g' d2)

NR==FNR 是一个有效地表示“如果我们仍在第一个文件中,请执行此操作”的技巧......关键是不要忘记使用 next 跳过其余的 awk 命令。一旦我们到达第二个文件,FNR 会翻转回 1,但 NR 会不断增加,因此它们永远不会再次相等。

所以对于第一个文件,我们只需将第二列的值加载到一个数组中,其中第一列与我们传递的变量匹配。您可以优化这一点,因为您说 d1 始终是唯一行。

因此,一旦我们进入下一个文件,逻辑就会跳过所有内容并运行$1 in y。这只是检查第一列是否在我们创建的数组中。如果是 awk 则打印第 2 列和第 3 列。

&lt;( sed 's/,/;/g' d2) 只是表示我们要将 sed 命令的输出视为文件。 sed 命令只是将 d2 中的逗号转换为分号,以便它与 awk 期望的 FS 匹配。

希望您对 awk 有所了解,请在此处阅读更多信息 http://www.catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls/,并在此处 http://www.catonmat.net/download/bash-redirections-cheat-sheet.pdf 提供出色的重定向备忘单。

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2021-02-01
    • 2023-03-16
    • 2017-11-02
    • 2018-04-02
    • 2020-12-15
    相关资源
    最近更新 更多