我有一个包含三列的 .txt 文件,每列由一个制表符分隔,有 264 行,称为 PowerCoords.txt。每行包含一个 x(第 1 列)、y(第 2 列)和 z(第 3 列)坐标。我想逐行浏览这个文件,将每个值分配给 X、Y 和 Z,然后将这些变量输入到另一个函数中。
我是 bash 的新手,我不明白如何指定我希望第 1 行、第 2 列中的值是变量 Y,依此类推......
我知道这可能非常简单,我可以在 Matlab 中快速完成,但我试图将所有内容都保存在 bash 中。
我有一个包含三列的 .txt 文件,每列由一个制表符分隔,有 264 行,称为 PowerCoords.txt。每行包含一个 x(第 1 列)、y(第 2 列)和 z(第 3 列)坐标。我想逐行浏览这个文件,将每个值分配给 X、Y 和 Z,然后将这些变量输入到另一个函数中。
我是 bash 的新手,我不明白如何指定我希望第 1 行、第 2 列中的值是变量 Y,依此类推......
我知道这可能非常简单,我可以在 Matlab 中快速完成,但我试图将所有内容都保存在 bash 中。
William Pursell 的回答要聪明得多,但在我直截了当的初学者心中,我前段时间尝试过:
#!/bin/bash
data="data.dat"
datalength=`wc $data | awk '{print $1;}'`
for (( i=1; i<=$datalength; i++ )) ;do
x=`cat $data | awk '{print $1;}' | sed -n "$i"p | sed -e 's/[eE]+*/\\*10\\^/'` ; x=`echo "$x" | bc -l` ; echo "x$i=$x";
y=`cat $data | awk '{print $2;}' | sed -n "$i"p | sed -e 's/[eE]+*/\\*10\\^/'` ; y=`echo "$y" | bc -l` ; echo "y$i=$y";
z=`cat $data | awk '{print $3;}' | sed -n "$i"p | sed -e 's/[eE]+*/\\*10\\^/'` ; z=`echo "$z" | bc -l` ; echo "z$i=$z";
# do something with xyz:
fslmaths ~/data/standard/MNI152_T1_2mm -mul 0 -add 1 -roi $x 1 $y 1 $z 1 0 1 point -odt float > NewFile$i
done
如果您喜欢使用浮点数并且输入也使用指数表示法,则必须添加和bc
。sed -e 's/[eE]+*/\\*10\\^/'
我遇到了类似的问题,但是对于大量输入数据,这些 bash 脚本非常慢。然后我迁移到perl。在 perl 中它看起来像这样:
#!/usr/bin/perl -w
use strict;
open (IN, "data.dat") or die "Error opening";
my $i=0;
for my $line (<IN>){
$i++;
open(OUT, ">NewFile$i.out");
chomp $line;
(my $x,my $y,my $z) = split '\t',$line;
print "$x $y $z\n";
# do something with xyz:
my $f= fslmaths ~/data/standard/MNI152_T1_2mm -mul 0 -add 1 -roi $x 1 $y 1 $z 1 0 1 point -odt float
print OUT "f= $f\n";
close OUT;
}
close IN;
while read x y z; do
echo x=$x y=$y z=$z
done < input.txt
以上要求您的所有列都不包含任何空格。
编辑:
作为对评论的回应,这是一种处理行编号的技术:
nl -ba < input.txt | while read line x y z rest; do
~/data/standard/MNI152_T1_2mm -mul 0 \
-add 1 -roi $x 1 $y 1 $z 1 0 1 point -odt float > NewFile$line
done