Bash:逐行读取文件,并将每个段作为参数处理到其他程序
我有一些脏活要做,所以Bash脚本似乎是一个不错的选择。我是Bash的新手,这种经历让我有点沮丧 文件mapfiles.txt由以下行组成。每条线有四段,中间用空格隔开。每个段表示外部程序名“prog”的输入参数。例如,“cm19_1.png”是文件名,“0001”是索引,“121422481”是经度,“31035995”是纬度 文件:mapfiles.txtBash:逐行读取文件,并将每个段作为参数处理到其他程序,bash,parameters,line-by-line,Bash,Parameters,Line By Line,我有一些脏活要做,所以Bash脚本似乎是一个不错的选择。我是Bash的新手,这种经历让我有点沮丧 文件mapfiles.txt由以下行组成。每条线有四段,中间用空格隔开。每个段表示外部程序名“prog”的输入参数。例如,“cm19_1.png”是文件名,“0001”是索引,“121422481”是经度,“31035995”是纬度 文件:mapfiles.txt cm19_1.png 0001 121422481 31035995 cm19_2.png 0002 121423224 3103599
cm19_1.png 0001 121422481 31035995
cm19_2.png 0002 121423224 31035995
cm19_3.png 0003 121423967 31035995
…
我想对每一行执行类似的命令。如下所示,prog的输入参数顺序略有不同。因此,编写bash脚本来处理重复的工作是有意义的
[Usage] prog <index> <longitude> <latitude> <filename>
example: prog 0001 121422481 31035995 cm19_1.png
我得到的实际结果是
cm19_1.png21422481 31035995
cm19_2.png21423224 31035995
cm19_3.png21423967 31035995
让我困惑的问题
嗯……我用vim在我的Mac电脑上写了这个脚本,然后把它复制到一个科学Linux机器和一个gentoo机器上。这三个家伙得到了同样可笑的结果。你可以简化很多:
while read file key log lat
do
echo "$cmd" "$key" "$log" "$lat" "$file"
done < "$input"
读取文件密钥日志lat时
做
回显“$cmd”“$key”“$log”“$lat”“$file”
完成<“$input”
prog
可能已消失,因为未导出$cmd
。您的/bin/sh版本可能会在另一个shell中执行while
语句。不应该是这样,我安装的bash也不是这样,但也许您在这个部门的行为方式很有趣
UPD我看到您有几个框给出了相同的结果。这使得次壳层理论不太可能。也许您的脚本和/或源文件中有一些有趣的角色
我已经将您的脚本和源文件复制并粘贴到我的gentoo框中,它给出了预期的结果。也许您也应该这样做,并将文件与原始文件进行比较。使用GNU Parallel,您可以在一行中完成它+您可以免费并行完成:
cat mapfile.txt | parallel --colsep '\s' prog {2} {3} {4} {1}
观看介绍视频了解更多信息:此处不可复制。寻找打字错误。另外,不使用所有剪切,只使用读取文件密钥日志lat
。UPD看到了答案。当在循环中结合ssh时,看看这个问题:非常感谢。你的评论帮助我找出真正的问题所在。不是Bash脚本--我在三个不同的框中测试它--是mapfiles.txt出错了。该文件在Windows中生成,每行以^M结尾。删除^M后,一切都很顺利。您可以进一步简化它。对于每个参数,您不需要单独的变量:在读取行时;执行echo$cmd$行;完成<“$input”
while read file key log lat
do
echo "$cmd" "$key" "$log" "$lat" "$file"
done < "$input"
cat mapfile.txt | parallel --colsep '\s' prog {2} {3} {4} {1}