【发布时间】:2015-06-02 22:18:10
【问题描述】:
我想获取位置参数作为 .sh 文件的参数,并且还想从文本文件中获取 awk 的字段。我发现我需要为两者都使用 $1-$9 并且可以在 awk 中使用相同的数字 $() 作为定位参数,它仍然有效。
例如我这样称呼我的 shell 脚本
./myProgram myFile.txt 1 2 3 4
然后在我的 shell 脚本中,我想使用 awk 来引用这样的文本文件中的字段,特别是 1,2:3,4 最后四个字段。
0000000022:trevor:736:1,2:3,4
0000000223:john:73:5,6:7,8
0000002224:eliza:54:9,8:7,6
0000022225:paul:22:5,4:3,2
0000222226:chris:0:1,2:3,4
所以我可以浏览这些字段,但是当我这样做时,因为有两种类型的字段分隔符,它似乎不起作用。
到目前为止我的 shell 脚本:
#! /usr/bin/env bash
file="$1"
awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "u1 =", $u1 }' $1
awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "v1 =", $v1 }' $1
awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "u2 =", $u2 }' $1
awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "v2 =", $v2 }' $1
echo "Argument #1 =" $2
echo "Argument #2 =" $3
echo "Argument #3 =" $4
echo "Argument #4 =" $5
这是我从终端得到的输出:
u1 = 1
u1 = 5
u1 = 9
u1 = 5
u1 = 1
v1 = awk: illegal field $(), name "v1"
input record number 1, file database.txt
source line number 1
u2 = awk: illegal field $(), name "u2"
input record number 1, file database.txt
source line number 1
v2 = awk: illegal field $(), name "v2"
input record number 1, file database.txt
source line number 1
Argument #1 = 1
Argument #2 = 2
Argument #3 = 3
Argument #4 = 4
到目前为止,我已经很接近了,我不知道为什么我不能使用我的 awk 脚本在各个领域中走得更远?
【问题讨论】:
-
通过坐标,我假设您的意思是字段。您的 awk 命令有几个问题,但您应该首先更好地解释您正在尝试做什么(使用文字),并显示 expected 示例输出。
标签: bash unix awk arguments sh