【问题标题】:Awk command with command line unix shell script带有命令行 unix shell 脚本的 awk 命令
【发布时间】:2014-06-24 18:01:13
【问题描述】:
awk -F, 'NR>1 && NR <10 {$8="abc";}1' OFS=, x.csv > y.csv

上面的命令正在成功地将 x.csv 文件的第 8 列替换为字符串 abc 的第 1 到第 10 行。 但我想在 shell 脚本中使用命令行参数传递起始行号(即 1)。 我该怎么做?

我试图写一个脚本,但没有结果

echo "first parameter is $1"
awk -F, 'NR>$1 && NR <10 {$8="abc";}1' OFS=, x.csv > y.csv

【问题讨论】:

  • awk 逐行读取输入。所以它只从第一行开始。

标签: linux bash shell unix


【解决方案1】:

使用-v 选项传递变量:

例如:

awk -F, -v start=1 'NR>start && NR < 10 ' /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh

另一种传递变量的方式:

awk -F, 'NR>start && NR < 10 ' start=8 /etc/passwd
mail:x:8:8:mail:/var/mail:/bin/sh

还有另一种方式:

start=8; awk -F, 'NR>'$start' && NR < 10 ' /etc/passwd
mail:x:8:8:mail:/var/mail:/bin/sh

【讨论】:

    【解决方案2】:

    您可以使用 -v 从您的 shell 脚本中传递变量:

    start=$1
    awk -F, -v start=1 'NR>start && NR <10 {$8="abc";}1' OFS=, x.csv > y.csv
    

    同样,您可以通过以下方式传递多个变量:

    awk -v start=1 -v end=10 ...
    

    【讨论】: