2012-07-10 6 views
1

왜이 프로그램이 작동하지 않는지 말해 주시겠습니까 ?? 내가 그것을 향상시키는 데 도움이된다.왜이 awk 스크립트는 쉘 변수를 보지 못합니까?

name phen1 phen2 
rs549 0.02 0.02 
rs699 0.03 0.03 
rs701 1 1 
rs751 0.449 0.449 
rs884 1 1 
rs923 0.9775 0.02 
rs970 0.9836 0.03 
rs1085 0.0001 0.99 
rs1220 0.9316 0.9316 

출력 파일을 각각 따라, 즉 두 개의 서로 다른 파일 phen_2.txt과 COL1과 COL2를 포함 phen_3.txt 및 COL1 및 COL3 것으로 예상됩니다

for i in $(seq 2 30); do awk '{if ($i < 0.05) print $1,$i}' test.txt > phen_$i.txt; done 

파일 TEST.TXT 다음하는 것은 같습니다 ~ 경우에. phen_2.txt에 대한

예상 결과 : phen_3.txt에 대한

rs549 0.02 
rs699 0.03 
rs1085 0.0001 

예상 결과 :

rs549 0.02 
rs699 0.03 
rs923 0.02 
rs970 0.03 

이 도와주세요!

+0

먼저 2 ~ 30이 아니라 2 ~ 3 인 시퀀스가 ​​있습니까? 또한, awk 내부에서 사용하는 $ i는 사용자가 생각하는 것이 아니며, 큰 따옴표로 감싸지 않았기 때문에 쉘은 변수 대체를 수행하지 않을 것입니다. – Thor84no

+0

@ Thor84no 시퀀스는 2 - 30입니다. –

답변

2
for ((i = 2; i <= 30; i++)); do awk -v i="$i" '$i < 0.05 {print $1, $i}' test.txt > "phen_$i.txt"; done 

사용 변수 전달 (-v)는 AWK 스크립트에 쉘 변수를 얻을 수 있습니다.

seq은 필요하지 않습니다.

편집 :

내 부분에 약간의 질투에 불타는 나쁜 오류를 수정했습니다.

awk '{for (i = 2; i <= 30; i++) {if ($i < 0.05) {print $1, $i > "phen_" i ".txt"}}}' test.txt 

이 한 번만 입력 파일을 통과하지만, 입력의 각 행에 대한 출력 파일의 설정을 통해주기 : 여기

는 AWK 내에서 완전히 같은 일을 할 수있는 방법입니다. 쉘 버전은 입력 파일을 반복적으로 읽지 만 각 출력 파일에 한 번 씁니다.

+0

Btw,'bash'에서'2..30}에서'for for '를 사용할 수 있습니다. – rush

+0

@rush : 당연히 알지만, 거기에는'seq'로 할 수있는 변수를 넣을 수 없습니다. –

+0

@DennisWilliamson 30 개의 파일이 생성되었지만 비어 있습니다. –

1

대신 사용 $$'$i'는 :

for i in $(seq 2 30) 
do 
    awk '{if ($'$i' < 0.05) print $1,$'$i'}' test.txt > phen_$i.txt 
done 

문제는 $i 배쉬에서이 ' ' -String에 들어갈 수 없다는 것입니다. 따라서 $i 전에 문자열을 닫은 다음 다시 한 번 열어야합니다.

+0

프로그램이 여전히 작동하지 않습니다 ..... 단지 $ 2에 대해 하나의 파일을 만듭니다 ??? –