2013-08-02 7 views
2

나는 몇 개의 qsub가있는 bash 스크립트를 가지고있다. 그들 각각은 시작하기 전에 preivous qsub가 완료되기를 기다리고 있습니다.내부의 awk

첫 번째 qsub은 특정 디렉토리의 파일을 perl 프로그램으로 보내고 outfiles를 새 디렉토리에 인쇄하는 것으로 구성됩니다. 결국, 나는 모든 직업 이름을 가진 배열을 되풀이한다. 이 스크립트는 의도적으로 작동합니다.

mkdir -p /perl_files_dir 
for ID_FILES in `ls Infiles_dir/*.txt`; 
do 
JOB_ID=`echo "perl perl_scirpt.pl $ID_FILES" | qsub -j oe ` 
JOB_ID_ARRAY="${JOB_ID_ARRAY}:$JOB_ID" 
done 
echo $JOB_ID_ARRAY 

내 두 번째의 qsub는 새로운 OUTFILE 내 펄 스크립트로 만든 내 모든 이전의 파일을 정렬하고 모든 작업이 depend=afterany로 (약 100 일)을 완료 한 후에 시작하기위한 것입니다. 다시 말하지만,이 부분은 잘 작동합니다.

SORT_JOB=`echo "sort -m -n perl_files_dir/*.txt >>sorted_file.txt" | qsub -j oe -W depend=afterany$JOB_ID_ARRAY` 
SORT_ARRAY="${SORT_ARRAY}:$SORT_JOB" 

내 문제는 내 정렬 된 파일에, 나는 (2 6) 제거 할 몇 열을 가지고있다, 그래서 나는 또 다른 depend=afterany

sed에 파이프 awk를 사용하여이 마지막 줄에 함께했다
SED=`echo "awk '{\$2="";\$3="";\$4="";\$5="";\$6=""; print \$0}' sorted_file.txt \ 
| sed 's/  //g' >final_file.txt" | qsub -j oe -W depend=afterany$SORT_ARRAY` 

이 마지막 단계는 final_file.txt을 생성하지만 비워 둡니다. 그렇지 않으면 내게 Command not found을 줄 것이기 때문에 SED=을 추가했습니다.

파이프가 없기 때문에 모든 것을 인쇄 할 수있었습니다. 불행히도 아무것도 인쇄하지 않습니다. 내 정렬 된 파일을 열지 않는다고 가정하고 내 sed 후에 내 최종 파일이 비어있는 것입니다. 그것이 사실이라면 왜 awk은 그것을 읽지 않을 것입니까?

내 스크립트에서 올바른 경로로 내 디렉터리와 파일을 정의하기 위해 변수를 사용하고 있습니다. 내 문제는 내 파일 또는 디렉토리를 찾기에 관한 것이 아니라 처음부터 완벽하게 정의되고 스크립트 전반에 걸쳐 사용되기 때문입니다. 나는 변수 대신 전체 경로를 쓰려고 노력했고 같은 결과를 얻었다.

답변

-1

내가 사용하고 awk의 버전, 문자

AWK --version
GNU awk는 3.1.7

[email protected]$ awk '{\$2="";\$3="";\$4=""; print \$0}' foo.txt 
awk: {\$2="";\$3="";\$4=""; print \$0} 
awk:^backslash not last character on line 

탈출 좋아하지 않는 다음 구문을 시도

awk '{for(i=2;i<=7;i++) $i="";print}' foo.txt 

토큰 4.x를 사용하는 경우 쉼표로 구분 된 작업 목록을 -W depend=과 함께 사용하지 못할 수도 있지만 대신 각 작업에 대해 새 PBS 선언 (-W)을 만들어야 할 수도 있습니다 .

예 ...

#Invalid syntax in newer versions of torque 
qsub -W depend=foo,bar 

자원

backslash in gawk fields
Print all but the first three columns
http://docs.adaptivecomputing.com/torque/help.htm#topics/commands/qsub.htm#-W

+0

Awk에서 백 슬래시가 표시되지 않습니다. 문제는 실제로''''도 보지 못한다는 것입니다. – Gilles

0
for ID_FILES in `ls Infiles_dir/*.txt` 

단순화 이것에

for ID_FILES in Infiles_dir/*.txt 

ls은 전달한 파일을 나열합니다 (디렉토리를 전달한 다음 내용을 나열 할 때 제외). 파일 목록을 표시하고 출력을 구문 분석하기보다는 이미 가지고있는 파일 목록을 사용하십시오! 파일 이름에 공백 문자 또는 와일드 카드 문자가 포함되어 있으면 ls의 출력을 구문 분석하는 것이 더 명확하고 빠릅니다. Don't parse the output of ls. 당신이 바로 그 장소에서 인용의 오른쪽 양식을 사용하는 경우

SORT_JOB=`echo "sort -m -n perl_files_dir/*.txt >>sorted_file.txt" | qsub -j oe -W depend=afterany$JOB_ID_ARRAY` 

당신은 당신의 인생을 간단하게 것입니다. 내부 인용문을 인용하는 방법을 모르기 때문에 역 인용 부호를 사용하지 마십시오. Use $(…) instead, 그것은 똑같은 방식으로 파싱된다는 점만 제외하면 정확히 동일합니다.

qsub으로 먹이는 셸 조각에 here document을 사용하는 것이 좋습니다. 걱정할 필요가있는 인용 문제가 거의없고 읽기 쉽습니다.

우리는 항상 변수 치환 및 명령 대체에 대해 큰 따옴표를 사용합니다 : "$some_variable", "$(some_command)". Annoyingly 쉘 구문에서 $var은 "변수 var의 값을 얻는다"는 의미가 아니라 "변수 var의 값을 취하여 와일드 카드 패턴 목록으로 구문 분석하고 각 패턴을 일치하는 파일 목록으로 바꿉니다 일치하는 파일이있는 경우 ". 이중 따옴표 (또는 여기에있는 문서에서)에서 대체가 발생하면이 여분의 내용이 해제됩니다. "$var"은 "변수의 값을 가져옵니다. var"을 의미합니다.

SORT_JOB=$(qsub -j oe -W depend="afterany$JOB_ID_ARRAY" <<'EOF' 
sort -m -n perl_files_dir/*.txt >>sorted_file.txt 
EOF 
) 

인용구가 실제로 문제를 일으키는 부분에 도달했습니다.

awk '{$2=;$3=;$4=;$5=;$6=; print $0}' sorted_file.txt | sed 's/  //g' >final_file.txt 

이 구문이 올바르지 않습니다, 당신은 모든 출력을 얻지 못하고있는 이유는 다음과 같습니다

SED=`echo "awk '{\$2="";\$3="";\$4="";\$5="";\$6=""; print \$0}' sorted_file.txt \ 
| sed 's/  //g' >final_file.txt" | qsub -j oe -W depend=afterany$SORT_ARRAY` 

echo 명령에 대한 인수가된다 문자열입니다.

awk 스 니펫 (awk snippet)이 의도 한 바에서 큰 따옴표를 벗어나지 않았습니다. 여기에있는 문서를 사용하면 훨씬 더 명확 해집니다. 또한 SED= 부분이 필요하지 않습니다. 명령의 출력을 대체하는 명령 대체 ( 사이의 명령)가 있으므로이 명령을 추가했습니다. 그러나 당신이 qsub 명령의 출력에 관심이 없으므로 출력을 가져 가지 말고 그냥 실행하십시오.

qsub -j oe -W depend="afterany$SORT_ARRAY" <<'EOF' 
awk '{$2="";$3="";$4="";$5="";$6=""; print $0}' sorted_file.txt | 
sed 's/  //g' >final_file.txt 
EOF 

나는 qsub를 잘 알고 모르겠지만, 아마도 오류 출력하고 실행하는 명령의 반환 상태를 얻을 수있는 방법이있다. 오류 출력을 검사하면 awk의 오류를 확인해야합니다.