awk 打印在 bash shell 脚本中不起作用

Awk print is not working inside bash shell script

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

IROG,1245,OUTO,OTUG,USUK

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

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

下面是 shell 脚本

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

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

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

但我预计只有 IROG。有人可以告诉我哪里错了吗?

你的反引号表达式中的 </code> 在被 shell 执行之前被 perl 扩展。大概它没有任何价值,所以您的 awk 命令只是 <code>{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 }' "$sample" > "$data"

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

有几种方法可以让您 trim 从您的第一个字段中领先的白人 space。一种是使用 sub 删除它:

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

这将从行首删除所有 space 个字符。同样,如果在 perl 中的反引号内执行此操作,请记住转义 $