2013-07-26 2 views
0

각 탭으로 구분 된 3 개의 열과 PowerCoords.txt라는 264 개의 행이있는 .txt 파일이 있습니다. 각 행은 x (열 1), y (열 2) 및 z (열 3) 좌표를 포함합니다. 이 파일을 한 줄씩 살펴보고 각 값을 X, Y 및 Z에 할당 한 다음 해당 변수를 다른 함수에 입력하고 싶습니다.3 열, 줄 단위로 텍스트 파일의 값에 변수 할당

내가 비난에 새로 온 사람, 그리고 내가 행 1의 값을 지정할 방법을 이해하지 않는, 열이 변수 Y하기 위해, 등등 ...

나는 이것을 알고 가능성이 매우 간단하고 Matlab에서 플래시로 할 수 있지만 모든 것을 bash로 유지하려고합니다.

+0

당신이 무엇을 하려는지 올바른 방법 일 가능성은 희박합니다. 3 가지 가치로 무엇을하는지에 관해 더 자세히 이야기하면 올바른 접근 방식을 제안 할 수 있습니다. –

+0

안녕하세요 Ed - 3 개의 값은 두뇌의 단일 복셀 위치에 대한 xyz 좌표입니다. 각 행은 복셀의 위치입니다. 이것은 내 입력 파일입니다. 3 입력 (xyz) 걸리고 입력 좌표 주위에 6mm 구를 만드는 기존 함수가 있습니다. 각 열의 값을 가져 와서 관심있는 함수에 입력하고 다음 행 (행)으로 이동하여 세 값을 입력하는 등의 작업을 수행하고 싶습니다.이 작업이 도움이되기를 바랍니다. 귀하의 의견을 보내 주셔서 감사합니다! – SteffieT

+0

예를 들어 첫 번째 행은 57 14 30입니다 (머리글 없음, 각 값은 탭으로 구분됨). 이 숫자 각각에 X, Y, Z 변수로 라벨을 붙이고 $ X $ Y $ Z를 사용하여 다른 함수에 입력하고 싶습니다. 그런 다음, 다음 행으로 이동하여 동일하게 반복하고 싶습니다. – SteffieT

답변

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 
+0

William -이 솔루션을 시도했지만 제대로 작동하지 못했습니다. xy z 값은 "while read x y z"루프에서 무엇을 나타 냅니까? 나는 레이블이없고, 숫자로 가득 찬 3 개의 열만 있습니다. – SteffieT

+0

x, y 및 z는 열에 부여한 이름입니다. 이렇게하면 입력을 읽고 첫 번째 열을'x' 변수에 할당하고, 두 번째 열을'y'로, 나머지 행을'z'에 할당합니다. 이걸 시도하면 어떻게 될까요? –

+0

동안 읽음 x y z; do > echo x = $ x y = $ y z = $ z > 완료 SteffieT

0

윌리엄 Pursell의 대답은 훨씬 더 똑똑하다,하지만 내 솔직 초보자에서 나는 다음과 같은 노력 마음 전에 약간의 시간 : 당신이 포인트 N 부동 사용하려는 경우

#!/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\\^/' 추가 할 필요가 숫자가 지수 표기법을 사용하는 경우에도 마찬가지입니다.

나는 비슷한 문제가 있었지만 입력 데이터가 많을 경우 배쉬 스크립트는 매우 느립니다. 나는 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; 
+0

@Ed Morton 제 솔루션에 왜 오류가 발생했는지 설명해주십시오. 나는 여기서 배우기를 원하며 당신의 의견에 정말로 관심이 있습니다. – EverythingRightPlace

관련 문제