我有一个脚本,我需要变成一个循环,脚本正常工作,因为我需要它(我的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。 –