2014-05-15 66 views
1

爲了方便和快速調試我的R代碼,我決定創建一個小巧的AWK腳本。它所要做的就是在特定目錄中解碼所有base64編碼的文件名(.RData)。我已經嘗試了兩次嘗試。以下是我迄今爲止的結果。任何幫助將不勝感激!微小公用事業解碼base64編碼文件名

第一次嘗試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 ""} 

然而,這個腳本的行爲是在奇怪,首先,它等待輸入,並其次,在收到EOFCtrl-D)後,不會產生任何輸出。

+0

我不在乎我的評價,但只是好奇爲什麼downvote。謹慎解釋? –

+0

這不是我,但我不得不想知道爲什麼你不只是問「這個print'foo bar 8'。爲什麼它不是'foo 4 bar 4'?'printf」foo \ nbar \ n「| awk'{print $ 1; print $ 1 |「wc -c」;}''「 –

+0

@thatotherguy:感謝您的評論!雖然有些人更喜歡簡潔,但其他人更喜歡理解上下文,而上下文通常包含基本的細節,因此非常重要。我相信每個人都是獨一無二的,因此,她有自己的提問,呈現信息等方式。我不認爲個人做事風格應該看作是價值較低。 –

回答

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擴展名被刪除。但是在特定的應用程序中可能沒有什麼區別。

+0

太棒了!非常感謝你!雖然我更喜歡'AWK'解決方案,這也是非常好的(和實用的)。我很欣賞另外一次學習'Unix' shell編程的機會! :-)作爲其他答案(截至目前)不提供完整和正確的解決方案,我會很樂意接受你的答案! –

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}}'

+0

謝謝你的回答!我只是試圖根據你的建議添加「close」(作爲塊的第三行),但它不起作用。我嘗試了兩個確切的命令行('close(「base64 -d - 」)')和一個變量引用('close(decode)')。 –

+1

你在第二個片段中試過了嗎?我正在測試第一個,但前提是一樣的。我應該提到,在測試這裏我從base64得到錯誤的輸入錯誤(雖然我也得到正確的解碼輸出)。 –

+0

是的,我在第二段中試了一下。我不確定壞的輸入消息來自哪裏。測試目錄應該包含文件,按照格式' .RData'命名。 –

2
while read 
do 
    base64 -d <<< $REPLY 
    echo 
done < infile.txt 

結果

 
prjLicense 
pubRoadmap 
totalDevs 
totalProjects 
AllProjects 
contribPeople 
contribProcess 
dmProcess 
devLinks 
devSupport 
+0

謝謝你的回答!我不想處理額外的文件 - 我想用管道將'ls -1

'的輸出直接發送到處理部分(最好是在我的第二次嘗試中,在工具的內部)。此外,你的代碼似乎不處理(放棄)文件擴展名 - 這就是爲什麼我試圖使用AWK(除了更熟悉它,它看起來更好恕我直言)。您能否建議您的代碼中的更改來處理上述要求? –

+0

看起來他的文件有不止一個字段按時間段分割。所以你需要使用IFS =。讀取文件extra',然後'printf「%s」$ file; base64 -d <<< $ file;回聲「或類似的東西,以獲得正確的輸出。 –