为了方便和快速调试我的R
代码,我决定创建一个小的AWK
脚本。它所要做的就是解码特定目录中所有base64编码的文件名(.RData
)。我尝试过两次尝试。以下是我到目前为止的结果。任何帮助将不胜感激!
第一次尝试是AWK
命令中的shell
脚本嵌入:
ls -1 ../cache/SourceForge | awk 'BEGIN {FS="."; print ""} {printf("%s", $1); printf("%s", " -> "); print $1 | "base64 -d -"; print ""} END {print ""}'
结果输出 关闭到所需的位置,然而,这个单行打印不是在原始编码的同一行上打印每个解码的文件名处理结束时所有已解码的名称完全没有输出分隔符:
cHJqTGljZW5zZQ== ->
cHViUm9hZG1hcA== ->
dG90YWxEZXZz ->
dG90YWxQcm9qZWN0cw== ->
QWxsUHJvamVjdHM= ->
Y29udHJpYlBlb3BsZQ== ->
Y29udHJpYlByb2Nlc3M= ->
ZG1Qcm9jZXNz ->
ZGV2TGlua3M= ->
ZGV2U3VwcG9ydA== ->
prjLicensepubRoadmaptotalDevstotalProjectsAllProjectscontribPeoplecontribProcessdmProcessdevLinksdevSupport
第二次尝试是以下自包含 AWK
脚本:
#!/usr/bin/gawk -f
BEGIN {FS="."; print ""; files = "ls -1 ../cache/SourceForge"}
{
decode = "base64 -d -";
printf("%s", $1); printf("%s", " -> "); print $1 | decode; print ""
}
END {print ""}
但是,此脚本的行为 令人惊讶,首先,它等待输入,其次,收到EOF
后Ctrl-D
}),不产生任何输出。
答案 0 :(得分:4)
主要是bash解决方案:
for f in ../cache/SourceForge/*; do
base=$(basename $f .RData)
echo "$base => $(base64 -d <<<$base)"
done
或者,使用更多bash:
for f in ../cache/SourceForge/*; do
f=${f##*/}; f=${f%%.*}
echo "$f => $(base64 -d <<<$f)"
done
在这两种情况下,您都可以使用../cache/SourceForge/*.RData
更具体地说明您想要的文件名。在第二个中,使用f=${f%.*}
将导致仅删除一个扩展名。或f=${f%.RData}
只会删除.RData
扩展名。但它在特定应用中可能没什么区别。
答案 1 :(得分:2)
你需要关闭你在每行之间写入的过程,或者awk将所有打印的行发送到同一个进程(并且它只在我猜完时打印输出)。将close("base64 -d -")
添加到该操作块的末尾(相同的命令字符串)。例如:
ls | awk -F. '{ printf("%25s -> ", $1); print $1 | "base64 -d -"; close("base64 -d -"); print "" }'
您的第二个代码段未运行ls
命令。它只是将它分配给一个变量并且不做任何事情。您需要将输出从ls
传输到awk -f <yourscript>
或./your-script.awk
或类似,以使其正常工作。 (顺便说一下,这就是为什么它等你输入的原因,你没有给它任何。)
要从awk实际运行ls,您需要使用getline。
像awk 'BEGIN {while ( ("ls -1" | getline) > 0 ) {print}}'
答案 2 :(得分:2)
while read
do
base64 -d <<< $REPLY
echo
done < infile.txt
结果
prjLicense pubRoadmap totalDevs totalProjects AllProjects contribPeople contribProcess dmProcess devLinks devSupport