我有一個腳本,我需要變成一個循環,腳本正常工作,因爲我需要它(我的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讓我知道,我的劇本是沒有錯的,並那麼其他人都說這個目錄不存在(即使我知道它確實存在),這幫助我確定文件夾有問題
檢查您的代碼與http://shellcheck.net – Jahid
哇,這是真棒,我從來沒有聽說過。希望它有幫助,謝謝 – moore1emu
由於shellcheck毫無疑問已經告訴你shell變量不會在單引號字符串內部擴展(雖然它的報告不如'awk'有用,因爲它顯得不夠聰明,顯然, awk腳本本身和awk的文件參數之間的區別)。如其他最佳實踐,請參閱:http://mywiki.wooledge.org/ParsingLs,http://mywiki.wooledge.org/DontReadLinesWithFor和http://mywiki.wooledge.org/BashFAQ/001。 –