我在UNIX文件系统中有file.txt。其内容如下:
{abc}]}
{pqr}]}
我想将此file.txt转换为:
[
{abc}]},
{pqr}]}
]
我可以使用下面的shell脚本执行此操作:
sed -i 's/}]}/}]},/g' file.txt
sed -i '1i [' file.txt
sed -i '$ s/}]},/}]}]/g' file.txt
我的问题是如果这个文件存在于/测试位置的HDFS上。
如果我使用:sed -i 's/}]}/}]},/g' /test/file.txt
它会查看unix partition / test并说文件不存在。
如果我使用:sed -i 's/}]}/}]},/g' | hadoop fs -cat /test/file.txt
它说----- sed:没有输入文件,然后根据cat命令打印file.txt的内容。
如果我使用hadoop fs -cat /test/file.txt | sed -i 's/}]}/}]},/g'
它说---- sed:没有输入文件 cat:无法写入输出流
那么,我该如何用其他字符串替换HDFS文件中的字符串?
答案 0 :(得分:8)
使用sed
和hdfs
命令:
hdfs dfs -cat /test/file.txt | sed 's/$/,/g; $s/,$/\n]/; 1i [' | hadoop fs -put -f - /test/file.txt
其中,
hdfs dfs -cat /test/file.txt
用于获取HDFS文件内容
s/$/,/g;
用于在每行末尾添加逗号
$s/,$/\n]/;
用于删除该行的逗号并添加带括号的换行符
1i [
用于在第一行添加括号
hadoop fs -put -f - /test/file.txt
用于覆盖HDFS中的原始文件