0

我有一个包含三列的 .txt 文件,每列由一个制表符分隔,有 264 行,称为 PowerCoords.txt。每行包含一个 x(第 1 列)、y(第 2 列)和 z(第 3 列)坐标。我想逐行浏览这个文件,将每个值分配给 X、Y 和 Z,然后将这些变量输入到另一个函数中。

我是 bash 的新手,我不明白如何指定我希望第 1 行、第 2 列中的值是变量 Y,依此类推......

我知道这可能非常简单,我可以在 Matlab 中快速完成,但我试图将所有内容都保存在 bash 中。

4

2 回答 2

0

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

如果您喜欢使用浮点数并且输入也使用指数表示法,则必须添加和bcsed -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;
于 2013-07-28T00:03:54.977 回答
0
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
于 2013-07-26T23:42:00.757 回答