Bash:逐行读取文件,并将每个段作为参数处理到其他程序

Bash:逐行读取文件,并将每个段作为参数处理到其他程序,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

我有一些脏活要做,所以Bash脚本似乎是一个不错的选择。我是Bash的新手,这种经历让我有点沮丧

文件mapfiles.txt由以下行组成。每条线有四段,中间用空格隔开。每个段表示外部程序名“prog”的输入参数。例如,“cm19_1.png”是文件名,“0001”是索引,“121422481”是经度,“31035995”是纬度

文件:mapfiles.txt

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
让我困惑的问题

  • “prog”在哪里
  • 空白在哪里
  • 参数顺序有什么问题

  • 嗯……我用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}