使用从制表符分隔的文本文件(Linux)读取的参数运行的批处理脚本

时间:2013-09-26 18:36:40

标签: linux shell batch-file

我有一个制表符分隔的txt文件,如下所示:

1. C1   34    98
2. C3    2    45

如何制作

的批处理脚本(linux)

将第一行中的第二个数据提取到变量1

将第一行中的第三个数据提取到变量2

将第一行中的第四个数据提取到变量3

然后

运行一系列脚本,其参数定义为变量1,2和3

e.g。

script $1 $2 $3 > path/file$1-$2-$3

脚本应该使用变量的值作为参数,然后将结果写出到根据变量值命名的文件,因此每个循环都会产生一个新文件)

当所有行都从制表符限制的txt文件中用完时,完成循环。

我不是程序员......

3 个答案:

答案 0 :(得分:2)

这可以仅在shell中完成(参见下文,假设IFS的默认值)

while read -r _ x y z ;
do 
   echo "$x" "$y" "$z"; 
done < input.txt

答案 1 :(得分:2)

假设您正在使用sh / bash / ksh,shell会为您提供所需内容:

while read dummy v1 v2 v3 dummy
do
   echo $v1 $v2 $v3
   ./dostuff $v1 $v2 $v3
done < inputFile

如何对行进行标记取决于IFS变量,该变量默认包含制表符,空格和换行符。您可以更改此设置,但必须仔细管理其内容,因为通过不将IFS恢复为默认值可以轻松破坏脚本。

所以我们在这里做的是读取文件inputFile并分成五个字段,dummy,v1,v2,v3和dummy。这些可以很容易地被称为a, b, c, d, e但是调用我们想要破坏虚拟的字段显然意图是什么。

如果您知道该文件只有四个字段,则不需要最后的dummy(即第一行可以是while read dummy v1 v2 v3);本质上,while read [...]中的最后一个字段会占用该行的其余部分,因此如果输入为1. 34 45 12 67 65,则最终dummy变量v3将包含{{1} }}。有了它,12 67 65变为v3,其余部分被读入12。如果你试验它会有意义: - )

答案 2 :(得分:0)

while read -r line
do
  var1=$(echo $line | awk '{print $2}')
  var2=$(echo $line | awk '{print $3}')
  var3=$(echo $line | awk '{print $4}')
  echo $var1 $var2 $var3
  ./yourscript.sh $var1 $var2 $var3
  # Do other stuff with these variables.
done < file