【问题标题】:Awk print is not working inside bash shell scriptawk 打印在 bash shell 脚本中不起作用
【发布时间】:2015-01-22 11:18:25
【问题描述】:

当我在 shell 外使用 AWK 打印命令时,它运行良好。以下是逗号分隔的文件(sample.txt)的内容。

IROG,1245,OUTO,OTUG,USUK

之后,在 shell 外部执行以下命令,我得到 IROG 作为输出。

cat sample.txt | awk -F, '{print $1}' > data.txt

下面是shell脚本

my $HOME        ='home/tmp/stephen';    
my $DATA        ="$HOME/data.txt";    
my $SAMPLE     ="$HOME/sample.txt";    
`cat $SAMPLE | awk -F, '{print $1}' > $DATA`;

但在这里我得到的内容与原始文件中的内容相同,而不是第一列。

输出是IROG,1245,OUTO,OTUG,USUK

但我只希望IROG。有人可以告诉我这里哪里错了吗?

【问题讨论】:

  • 这是 perl 脚本,不是 bash shell 脚本

标签: bash shell unix awk


【解决方案1】:

反引号表达式中的$1 在被shell 执行之前被perl 扩展。大概它没有任何价值,所以您的 awk 命令只是 {print },它会打印整个记录。您应该转义 $ 以防止这种情况发生:

`awk -F, '{print \$1}' "$SAMPLE" > "$DATA"`;

请注意,我已经引用了您的变量,并且还删除了您对 cat 的无用使用。

如果您打算使用 shell 脚本,而不是 perl 脚本(这是您目前拥有的),您可以这样做:

home=home/tmp/stephen
data="$home/data.txt"
sample="$home/sample.txt"
awk -F, '{print $1}' "$sample" > "$data"

在shell中,变量赋值中不能有空格。此外,使用大写变量名被认为是不好的做法,因为您可能会覆盖 shell 内部使用的变量名。此外,在变量扩展周围使用双引号被认为是一种很好的做法,以防止与分词和全局扩展相关的问题。

有几种方法可以从第一个字段中修剪前导空格。一种是使用sub 将其删除:

awk -F, '{sub(/^ */, ""); print $1}'

这会删除行首的所有空格字符。同样,如果在 perl 的反引号中这样做,请记住转义 $

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2011-10-14
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多