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

时间:2011-10-01 09:43:17

标签: 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 31035995
cm19_3.png 0003 121423967 31035995
…

我想对每一行执行类似的命令。如下所示,prog的输入参数顺序略有不同。所以编写一个bash脚本来处理重复的工作是有意义的。

[Usage] prog <index> <longitude> <latitude> <filename>
example: prog 0001 121422481 31035995 cm19_1.png

通常,bash脚本将以这种方式运行:

  1. 从mapfiles.txt
  2. 中读取一行
  3. 拆分段
  4. 使用正确的参数顺序调用prog
  5. 这是run.sh。

    #!/bin/sh
    
    input=mapfiles.txt
    cmd=prog
    
    while read line
    do
            file=$(echo $line | cut -d' ' -f1)
            key=$(echo $line | cut -d' ' -f2)
            log=$(echo $line | cut -d' ' -f3)
            lat=$(echo $line | cut -d' ' -f4)
            echo $cmd $key $log $lat $file
    done < "$input"
    

    我的期望

    prog 0001 121422481 31035995 cm19_1.png
    prog 0002 121423224 31035995 cm19_2.png
    prog 0003 121423967 31035995 cm19_3.png
    … 
    

    我得到的实际结果是

     cm19_1.png21422481 31035995
     cm19_2.png21423224 31035995
     cm19_3.png21423967 31035995
    

    困扰我的问题

    1. 'prog'在哪里?
    2. 白色空间在哪里?
    3. 参数顺序有什么问题?
    4. 嗯......我使用vim在Mac上编写了这个脚本并将其复制到Scientific Linux盒子和gentoo盒子中。这三个家伙得到了同样荒谬的输出。

3 个答案:

答案 0 :(得分:48)

你可以简化这个:

while read file key log lat
do
  echo "$cmd" "$key" "$log" "$lat" "$file"
done < "$input"

答案 1 :(得分:9)

使用GNU Parallel你可以在一行中完成它+你可以免费并行完成它:

cat mapfile.txt | parallel --colsep '\s' prog {2} {3} {4} {1}

观看介绍视频以了解详情:http://www.youtube.com/watch?v=OpaiGYxkSuQ

答案 2 :(得分:2)

prog可能已经消失,因为$cmd未导出。您的/ bin / sh版本可能会在单独的shell中执行while语句。这不应该是这种情况,而且我的bash安装不是这种情况,但也许你的部门会以有趣的方式行事。

UPD 我看到你有几个盒子可以提供相同的结果。这使得子壳理论不太可能。也许你的脚本和/或源文件中有一些有趣的字符。

我已将您的脚本和源文件复制并粘贴到我的gentoo框中,并提供了预期的结果。也许您应该这样做,并将文件与原始文件进行比较。