2015-06-15 86 views
1

我有一個腳本,我需要變成一個循環,腳本正常工作,因爲我需要它(我的Awk-fu非常薄弱,所以很好),當我把在文件名中就像下面的例子。將腳本更改爲做完循環

#!/bin/bash 
awk -v FS='(<LastName>|<\/LastName>)' '{print $2}' 17822624.xml >> test.csv 
awk -v FS='(<FirstName>|<\/FirstName>)' '{print $2}' 17822624.xml >> test.csv 
awk -v FS='(<Id>|<\/Id>)' '{print $2}' 17822624.xml >> test.csv 
awk -v FS='(<Dob>|<\/Dob>)' '{print $2}' 17822624.xml >> test.csv 
awk -v FS='(<TestDate>|<\/TestDate>)' '{print $2}' 17822624.xml >> test.csv 
#this awk command is different because their are multiple different values i need it to pull back 
awk -F '<Value>|<\/Value>' '{for (i=2; i<=NF; i+=2) print $i}' 17822624.xml >> test.csv 
cat test.csv | tr '\n' ',' > test2.csv 
awk 'BEGIN{RS=ORS=','} {sub(/ ..:..:..$/,'')} !seen[$0]++' test2.csv > test3.csv 

當我將它轉換爲做完成循環是當我有問題。我相信這與單引號和雙引號相關,並且)vs {。但我很幸運地嘗試了很多不同的東西。

這裏是我創建

#!/bin/bash 
#file location 
XMLDIR='/home/amoore19/XML/00581-001/scores' 
NEWXML='/home/amoore19/XML/00581-001' 

#this gives me the filenames without the path 
for file in `ls ${XMLDIR}/*.xml | xargs -n1 basename` 
do 
awk -v FS='(<LastName>|<\/LastName>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<FirstName>|<\/FirstName>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<Id>|<\/Id>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<Dob>|<\/Dob>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<TestDate>|<\/TestDate>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -F '<Value>|<\/Value>' '{for (i=2; i<=NF; i+=2) print $i}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
"${NEWXML}/${file}" | tr '\n' ',' > "${NEWXML}/1${file}" 
awk "BEGIN{RS=ORS=,} {sub(/..:..:..$/,"")} !seen[$0]++" "${NEWXML}/1${file}" > "${NEWXML}/2${file}" 
done 

這是我的錯誤的循環:我曾嘗試切換爲雙單引號有沒有更好的運氣

$ ./ifthen.sh 
ls: /home/amoore19/XML/00581-001/scores/*.xml: No such file or directory 
basename: missing operand 
Try `basename --help' for more information. 

就像我說的頂部的例子很好,但我需要能夠循環通過文件夾中的多個文件。

我知道這很難看,我知道awk可以在循環中完成整個事情,但我不知道如何創建它。有一天我會,但現在這是我能做的最好的事情,我真的可以使用一些幫助/指導什麼是我的循環錯了。

謝謝

UPDATE

我的代碼,據我可以用shellcheck後更新。仍然遇到提及的錯誤。

新更新

所以我覺得我找到了我的問題,但我不明白爲什麼它是一個問題嗎?我做了一個新的bash腳本,這個腳本簡單地做了一個cd到目錄,它仍然說它不存在。如果我這樣做只是/ home/amoore19/XML它的工作原理,但有關文件夾名稱00581-001正在導致我的問題......任何想法?

最後更新 我刪除了文件夾00581-001並重新創建它,移動文件回來,我不再得到錯誤...即時猜測它在某種程度上成爲腐敗?

這裏是當前工作的腳本(我偶然在娛樂增加了額外的0到它):

#!/bin/bash 
#file location 
XMLDIR='/home/amoore19/XML/000581-001/scores' 
NEWXML='/home/amoore19/XML/000581-001' 

#this gives me the filenames without the path 
for file in `ls ${XMLDIR}/*.xml | xargs -n1 basename` 
do 
awk -v FS='(<LastName>|<\/LastName>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<FirstName>|<\/FirstName>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<Id>|<\/Id>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<Dob>|<\/Dob>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<TestDate>|<\/TestDate>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -F '<Value>|<\/Value>' '{for (i=2; i<=NF; i+=2) print $i}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
"${NEWXML}/${file}" | tr '\n' ',' > "${NEWXML}/1${file}" 
awk "BEGIN{RS=ORS=,} {sub(/..:..:..$/,"")} !seen[$0]++" "${NEWXML}/1${file}" > "${NEWXML}/2${file}" 
done 

感謝大家的幫助下,shellcheck讓我知道,我的劇本是沒有錯的,並那麼其他人都說這個目錄不存在(即使我知道它確實存在),這幫助我確定文件夾有問題

+1

檢查您的代碼與http://shellcheck.net – Jahid

+0

哇,這是真棒,我從來沒有聽說過。希望它有幫助,謝謝 – moore1emu

+1

由於shellcheck毫無疑問已經告訴你shell變量不會在單引號字符串內部擴展(雖然它的報告不如'awk'有用,因爲它顯得不夠聰明,顯然, awk腳本本身和awk的文件參數之間的區別)。如其他最佳實踐,請參閱:http://mywiki.wooledge.org/ParsingLs,http://mywiki.wooledge.org/DontReadLinesWithFor和http://mywiki.wooledge.org/BashFAQ/001。 –

回答

0

原來的代碼是不是無效的(必須糾正一些問題,引用),但是該文件夾是腐敗的,當我試圖在bash腳本中使用它。這裏是目錄變量周圍正確的雙引號的工作代碼。

#!/bin/bash 
#file location 
XMLDIR='/home/amoore19/XML/00581-001/scores' 
NEWXML='/home/amoore19/XML/00581-001' 

#this gives me the filenames without the path 
for file in `ls ${XMLDIR}/*.xml | xargs -n1 basename` 
do 
awk -v FS='(<LastName>|<\/LastName>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<FirstName>|<\/FirstName>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<Id>|<\/Id>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<Dob>|<\/Dob>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -v FS='(<TestDate>|<\/TestDate>)' '{print $2}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
awk -F '<Value>|<\/Value>' '{for (i=2; i<=NF; i+=2) print $i}' "${XMLDIR}/${file}" >> "${NEWXML}/${file}" 
"${NEWXML}/${file}" | tr '\n' ',' > "${NEWXML}/1${file}" 
awk "BEGIN{RS=ORS=,} {sub(/..:..:..$/,"")} !seen[$0]++" "${NEWXML}/1${file}" > "${NEWXML}/2${file}" 
done 
1

您可能沒有該目錄中的任何XML文件,因此shell擴展只是是${XMLDIR}/*.xml。你可以嘗試使用find代替:

find ${XMLDIR}/*.xml -exec `basename` | while read file; do 
... 
... 
done 
+1

當我替換:在文件在'ls $ {XMLDIR}/*。xml | xargs -n1 basename':find $ {XMLDIR}/*。xml -exec'basename' |同時讀取文件; 我收到以下錯誤: basename:missing operand 嘗試'basename --help'以獲取更多信息。 找到:缺少參數到'-exec' – moore1emu

+0

沒有得到那個錯誤了,我解決了壞文件夾問題後,謝謝你的幫助 – moore1emu