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

Jia*_* W. 36 parameters bash 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
…
Run Code Online (Sandbox Code Playgroud)

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

[Usage] prog <index> <longitude> <latitude> <filename>
example: prog 0001 121422481 31035995 cm19_1.png
Run Code Online (Sandbox Code Playgroud)

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

  1. 从mapfiles.txt中读取一行
  2. 拆分细分
  3. 使用正确的参数顺序调用prog

这是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"
Run Code Online (Sandbox Code Playgroud)

我的期望是什么

prog 0001 121422481 31035995 cm19_1.png
prog 0002 121423224 31035995 cm19_2.png
prog 0003 121423967 31035995 cm19_3.png
… 
Run Code Online (Sandbox Code Playgroud)

我得到的实际结果是

 cm19_1.png21422481 31035995
 cm19_2.png21423224 31035995
 cm19_3.png21423967 31035995
Run Code Online (Sandbox Code Playgroud)

困扰我的问题

  1. 'prog'在哪里?
  2. 白色空间在哪里?
  3. 参数顺序有什么问题?

嗯......我使用vim在Mac上编写了这个脚本并将其复制到Scientific Linux盒子和gentoo盒子里.这三个家伙得到了同样荒谬的输出.

Mat*_*Mat 49

你可以简化这个:

while read file key log lat
do
  echo "$cmd" "$key" "$log" "$lat" "$file"
done < "$input"
Run Code Online (Sandbox Code Playgroud)

  • 您可以进一步简化它.每个参数都不需要单独的变量:`read line line; 做echo $ cmd $ line; 完成<"$ input"` (9认同)

Ole*_*nge 9

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

cat mapfile.txt | parallel --colsep '\s' prog {2} {3} {4} {1}
Run Code Online (Sandbox Code Playgroud)

观看介绍视频以了解更多信息:http://www.youtube.com/watch?v = OpaiGYxkSuQ