2015-06-15 109 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