1

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

1. C1   34    98
2. C3    2    45

我怎样才能制作一个批处理脚本(linux)

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

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

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

然后

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

例如

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

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

从Tab Limited TXT文件中用完所有线路时,完成循环。

我不是程序员...

4

3 回答 3

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 很明显意图是什么。

如果您知道该文件将只有四个字段,则dummy不需要最后一个(即第一行可以是while read dummy v1 v2 v3);本质上,最后一个字段while read [...]吸收了该行的其余部分,因此如果输入是1. 34 45 12 67 65那么没有最终dummy变量v3将包含12 67 65. 有了它,v3就变成12了与被读入的行的其余部分dummy。如果您尝试一下,这将是有意义的:-)

于 2013-09-26T19:04:45.320 回答
2

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

while read -r _ x y z ;
do 
   echo "$x" "$y" "$z"; 
done < input.txt
于 2013-09-26T19:01:58.080 回答
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
于 2013-09-26T18:45:02.493 回答