shell脚本逐行读取文件不起作用

时间:2014-08-20 22:55:40

标签: bash shell unix

我有这个主脚本

>loanIds
>log
>count
mkdir -p duplicates
rm -rf duplicates/*
for file  in x*
do
./getXmlData.sh $file &
done

getXmlData.sh的来源

cat $file | while read line
do
echo $file" | "$line
done     

我有40个以字母x开头的文件 每个x *文件有1000行。

当我运行脚本时,您可以看到它将在后台创建40个实例并处理每个x *文件

我遇到的问题是,。/ getXmlData.sh不回显这40个文件中的每一个的所有1000行......对于某些文件,它回显所有1000行...对于其中一些,它只回显10-15行

可能是什么问题?

2 个答案:

答案 0 :(得分:3)

除非您未在getXmlData.sh脚本中显示作业,否则问题很可能是您在调用脚本中传递$file,但您需要将其作为$1引用被调用的脚本。也就是说,你应该写:

cat "$1" |
while read -r line
do
    echo "$1 | $line"
done

或(更好 - 避免使用UUOC或无用cat):

while read -r line
do
    echo "$1 | $line"
done < "$1"

或类似的东西。实际上,我们甚至可以建议:

sed "s%^%$1 | %" "$1"

这假设文件名不包含换行符或百分号(但允许名称包含斜杠,因此在%中使用/而不是s///命令)。请注意,每次使用时,文件名都用双引号括起来;这可以保护您的脚本免受包含空格等的文件名的影响。另请注意,echo$line(以及$1)括在双引号中;这样可以保留数据中的间距,并避免使用其他metacharacter expansions。如果你真的想要将所有多个空格或标签组转换为单个空格,那么原始配方就可以了,但这很少是理想的结果。

另一种可能性:也许在循环之后,你应该等待所有的孩子完成。你通过告诉shell:

来做到这一点
wait

在后台进程终止之前,它不会进一步发展。

答案 1 :(得分:0)

尝试这种方式 - &gt;

file=$1
chmod 755 $file
exec <$file
while IFS= read -r
do
    echo "$file | $REPLY"
done

或者为了避免问题&#34;阅读&#34;命令,我想出了以下逻辑,基本上计算行数并使用head / tail命令逐个打印 - &gt;

file=$1 
lines=`wc -l $file | cut -d" " -f1`
for ((i=1;i<=$lines;i++));
do
    line=`head -$i $file | tail -1`
    echo "$file | $line"
done