Bash:逐行读取文件并将每个段作为参数处理给其他程序 [英] Bash: read a file line-by-line and process each segment as parameters to other prog

查看:13
本文介绍了Bash:逐行读取文件并将每个段作为参数处理给其他程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have some dirty work to do, so a Bash script seems to be a good choice. I'm new to Bash, and the experience makes me kind of frustrated.

文件 mapfiles.txt 由以下几行组成.每行有四段,由空格分隔.每个段代表一个外部程序名称prog"的输入参数.例如,cm19_1.png"是文件名,0001"是索引,121422481"是经度,31035995"是纬度.

The file mapfiles.txt consists of lines as follow. Each line has four segments separated by a white space. Each segment represents a input parameter to an external program name 'prog'. For example, "cm19_1.png" is the filename, "0001" the index, "121422481" the longitude, and "31035995" the latitude.

文件:mapfiles.txt

File: mapfiles.txt

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

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

I want to execute similar commands to each line. As show below, the prog's input parameter order is slightly different. So it makes sense to write a bash script to handle the repeated work.

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

一般bash脚本会这样操作:

Generally, the bash script will operate in this way:

  1. 从 mapfiles.txt 中读取一行
  2. 分割片段
  3. 使用正确的参数顺序调用程序

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. 参数顺序有什么问题?

嗯……我在我的 Mac 上使用 vim 编写了这个脚本,并将它复制到一个 Scientific Linux 机器和一个 gentoo 机器上.这三个家伙得到了同样荒谬的输出.

Hmm… I wrote this script on my Mac using vim and copy it to a Scientific Linux box and a gentoo box. These three guys get the same ridiculous outputs.

推荐答案

你可以简化很多:

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

这篇关于Bash:逐行读取文件并将每个段作为参数处理给其他程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆