2015-01-22 6 views
2

쉘 외부에서 AWK print 명령을 사용할 때 완벽하게 작동합니다. 다음은 쉼표로 구분 된 파일 (sample.txt)의 내용입니다.bash 쉘 스크립트에서 Awk 인쇄가 작동하지 않습니다.

IROG,1245,OUTO,OTUG,USUK 

쉘 외부에서 아래 명령을 실행하면 IROG이 출력됩니다. 다음은

cat sample.txt | awk -F, '{print $1}' > data.txt 

는 쉘 스크립트 내부

my $HOME  ='home/tmp/stephen';  
my $DATA  ="$HOME/data.txt";  
my $SAMPLE  ="$HOME/sample.txt";  
`cat $SAMPLE | awk -F, '{print $1}' > $DATA`; 

이다 그러나 여기 내가 원본 파일 대신 1 열에서와 동일한 콘텐츠를.

출력은 IROG,1245,OUTO,OTUG,USUK

하지만 난 단지 IROG를 기대합니다. 누군가 내가 여기서 잘못된 생각을 할 수 있습니까?

+5

이것은 bash 쉘 스크립트가 아닌 perl 스크립트입니다. –

답변

11

backticks 표현식 내의 $1은 쉘에 의해 실행되기 전에 perl에 의해 확장 중입니다. 아마 값이 없기 때문에 awk 명령은 단순히 {print }이며 전체 레코드를 인쇄합니다. 당신은 이런 일이 발생을 방지하기 위해 $ 탈출한다 : 나는 또한 당신의 변수를 인용 한

`awk -F, '{print \$1}' "$SAMPLE" > "$DATA"`; 

참고 cat의 당신의 쓸모없는 사용을 제거했습니다. 당신이 (당신이 현재 가지고 무엇 인) 펄 하나는 반대로, 쉘 스크립트를 사용하는 것을 의미하는 경우

, 당신은이 작업을 수행 할 수 있습니다 쉘에서

home=home/tmp/stephen 
data="$home/data.txt" 
sample="$home/sample.txt" 
awk -F, '{print $1}' "$sample" > "$data" 

을, 어떤이 없어야합니다 변수 할당에 공백이 있습니다. 또한 쉘에서 내부적으로 사용하는 변수 이름을 덮어 쓸 위험이 있으므로 UPPERCASE 변수 이름을 사용하는 것은 나쁜 습관으로 간주됩니다. 또한 변수 확장에 대해 큰 따옴표를 사용하여 단어 분리 및 glob 확장과 관련된 문제를 방지하는 것이 좋습니다.

첫 번째 입력란에서 선행 공백을 제거 할 수있는 몇 가지 방법이 있습니다. 하나는 그것을 제거하는 sub을 사용하는 것입니다 :

awk -F, '{sub(/^ */, ""); print $1}' 

이 라인의 시작에서 모든 공백 문자를 제거합니다. 다시 말하지만, perl에서 역 따옴표 안에서 이것을 수행하는 경우 $을 탈출하는 것을 잊지 마십시오.

관련 문제