1

我正在尝试通读文件的第一行并找到在命令行中指定的列。例如:command <column> <textfile>so column is$1和 textfile $2

我正在编写一个 awk 命令来将文件列拆分为一个数组,然后是一个 for 循环来检查数组元素何时与列参数匹配。这是代码:

awk 'NR == 1 {split ( $0,titles ); for ( i=1 ; titles[i] != "$1" ; i++ ) ; FS = " "} NR > 1 {print $i }' file

我希望$1引用第一个命令行参数而不是 awk 看到的第一列。 如何在 for 循环中获取 column 参数?我以为我可以为变量创建一个变量$1并将其传递给它,awk但这没有用,或者我做错了——非此即彼。几个小时以来,我一直在查找有关此的内容。我可能会遗漏一些明显或愚蠢的东西,但它已经到了我真的只需要知道如何做到这一点的地步。同样在我寻找答案的过程中,我阅读了有关ARGV[]. 我想ARGV[1] == $1但显然不是这样的ARGV数组指的是什么?谢谢你的尽心帮助。

(注意:只是为了帮助解决任何混淆文件是文本文件的编辑版本,称为 $2)

4

2 回答 2

3
awk -v column="$1" 'NR == 1 { ... } NR > 1 { ... }' "$2"

在脚本内部,您可以通过名称(标志预设变量)awk引用传递给 shell 脚本的值。$1column-vawk

我不太明白你对你在做什么的解释,但我认为我会使用:

awk -v column="$1" '
    NR == 1 { for (i = 1; $i != column && i <= NF; i++) ; }
    NR >  1 { print $i }' \
    "$2"

awk将行拆分为单独的字段;你不需要这个split功能;你也不需要玩FS.

于 2012-09-23T04:02:49.193 回答
2

在 awk 中,第一个命令行参数是ARGV[1],而$1是当前行的第一个单词。他们是两个完全不同的东西。

例如:

$ awk 'BEGIN { print "ARGV[1] =", ARGV[1] }' foo bar
ARGV[1] = foo
于 2012-09-23T03:58:26.777 回答