当我在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`;
但是在这里我得到的内容与原始文件相同,而不是第1列。
输出为IROG,1245,OUTO,OTUG,USUK
但我只期望IROG
。有人可以告诉我错在哪里吗?
答案 0 :(得分:11)
你的反引号表达式中的$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中,变量赋值中不能有空格。此外,使用UPPERCASE变量名称被认为是不好的做法,因为您可能会覆盖shell内部使用的变量名称。此外,在变量扩展周围使用双引号来防止与单词拆分和全局扩展相关的问题被认为是一种好的做法。
您可以通过几种方法修剪第一个字段中的前导空格。一种方法是使用sub
删除它:
awk -F, '{sub(/^ */, ""); print $1}'
这将从行的开头删除任何空格字符。同样,如果在perl中的反引号内执行此操作,请记住转义$
。