我有一个制表符分隔的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文件中用完时,完成循环。
我不是程序员......
答案 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