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

ste*_*cob 2 unix bash shell awk

当我在shell外部使用AWK打印命令时,它工作得很好.下面是以逗号分隔的文件(sample.txt)的内容.

IROG,1245,OUTO,OTUG,USUK
Run Code Online (Sandbox Code Playgroud)

之后,在shell外执行下面的命令我得到IROG输出.

cat sample.txt | awk -F, '{print $1}' > data.txt
Run Code Online (Sandbox Code Playgroud)

下面是shell脚本

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

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

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

但我只期待IROG.有人可以告诉我这里错了吗?

Tom*_*ech 11

$1你的反引号内的表达是由Perl中被shell执行之前扩大.据推测它没有任何价值,所以你的awk命令很简单{print },它打印整个记录.你应该逃避,$以防止这种情况发生:

`awk -F, '{print \$1}' "$SAMPLE" > "$DATA"`;
Run Code Online (Sandbox Code Playgroud)

请注意,我引用了您的变量,并删除了您无用的使用cat.

如果你想使用shell脚本,而不是perl脚本(这是你现在得到的),你可以这样做:

home=home/tmp/stephen
data="$home/data.txt"
sample="$home/sample.txt"
awk -F, '{print $1}' "$sample" > "$data"
Run Code Online (Sandbox Code Playgroud)

在shell中,变量赋值中必须没有空格.此外,使用UPPERCASE变量名称被认为是不好的做法,因为您可能会覆盖shell内部使用的变量名称.此外,在变量扩展周围使用双引号来防止与单词拆分和全局扩展相关的问题被认为是一种好的做法.

您可以通过几种方法修剪第一个字段中的前导空格.一个是sub用来删除它:

awk -F, '{sub(/^ */, ""); print $1}'
Run Code Online (Sandbox Code Playgroud)

这将从行的开头删除任何空格字符.再一次,记得$在perl的反引号中逃避if.