我正在尝试将apache avro-tools(avro-tools-1.7.5.jar)concat实用程序包装成正确的通配(如所写的,所有要连接的文件都需要完全写出来)。需要此实用程序是因为常规cat
(或在我的情况下hadoop fs -cat
)操作将生成带有中间标题的数据并导致avro解析实用程序出错。我写了一个名为catavro.sh
的简单shell脚本:
avrohdfs='hadoop jar /path/to/jar/avro-tools-1.7.5.jar'
DIRS=`hadoop fs -ls $1 | egrep '.avro' | awk '{print $8}'`
echo `$avrohdfs concat $DIRS -` # dash (-) tells utility to print to stdout
这确实很重要,但如果我运行bash catavro.sh [path to avro data on hdfs] > tmp.avro
,结果就是一个损坏的avro文件。尝试读取架构时会抛出错误,或者执行其他操作。如果我用shell脚本替换shell脚本中的最后一行:
echo $avrohdfs concat $DIRS -
仅打印命令,然后在终端上运行生成的命令,将结果存储到同一个tmp.avro文件中,操作很顺利。 tmp.avro的文件大小有点大。
我很确定echo
命令应该归咎于此,它似乎破坏了avro-tools concat unitlity产生的二进制数据。用:
`$avrohdfs concat $DIRS - > tmp.avro`
产生与返回命令并在终端中运行命令相同(成功)的结果。但是,虽然我可以写入文件,但如果我可以将其返回到stdout
,那么对我来说会更好,这样它就可以通过管道传输到我拥有的过滤工具中。
echo
有哪些替代方案?我尝试用以下所有内容替换脚本中的最后一行但没有成功:
echo -E `$avrohdfs concat $DIRS -`
`$avrohdfs concat $DIRS -`
$($avrohdfs concat $DIRS -)
cat `$avrohdfs concat $DIRS -`
trap `$avrohdfs concat $DIRS -` 0 #sort of works, but data misses the ">tmp.avro" and spits into the termal
我检查了PATH变量,它在我的终端和shell脚本中是相同的。非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
问题是shell将参数解释为echo
并将换行符转换为空格并删除重复的空格。您可以使用双引号来阻止:
echo "`$avrohdfs concat $DIRS -`"
或者更好的是,只需运行命令,不需要任何echo
或其他任何内容:
$avrohdfs concat $DIRS -