0

タブで区切られた 3 つの列と、PowerCoords.txt という 264 行からなる .txt ファイルがあります。各行には、x (列 1)、y (列 2)、および z (列 3) 座標が含まれます。このファイルを 1 行ずつ調べて、各値を 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 に答える