在Bash shell脚本中,Awk print命令无法正常工作

5
当我在 shell 外使用 AWK 的打印命令时,它可以完美运行。下面是一个逗号分隔的文件(sample.txt)的内容:
IROG,1245,OUTO,OTUG,USUK

执行下列命令后,我在控制台外得到输出结果为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。有人能指出我在哪里错了吗?


5
这是一个 Perl 脚本,不是一个 Bash shell 脚本。 - Tom Fenech
1个回答

16

在反引号表达式中,$1被 Perl 展开后才被 shell 执行。假定其没有值,那么您的 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中使用反引号时,请转义$


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接