2014-07-18 2 views
2

gnuplot에서 awk에 쉘 변수를 전달해야하지만 오류 메시지가 나타납니다 : 변수는 sript에 설정되어 있으며 FILE이라고합니다. 날짜에 따라 변경됩니다. 내 코드 : (A의 gnuplot 스크립트)gnuplot에서 awk에 쉘 변수 전달하기

plot FILE using 1:14 with points pointtype 7 pointsize 1 # this works fine 

replot '< awk ''{y1 = y2; y2 = $14; if (NR > 1 && y2 - y1 >= 100) printf("\n") ; if (NR > 1 && y2 -y1 <= -100) printf("\n"); print}'' FILE' using 1:14 with linespoints 
Err msg 
awk: fatal: cannot open file `FILE' for reading (No such file or directory) 

내가 하드 코드 파일 경로 replot 작품.

누구나이 변수를 awk에 전달해야하는 코드를 명확히 할 수 있습니까? 여기

% environment_variable=FILE 
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }' ? 

내의 gnuplot 스크립트 코드입니다 : 내가 좋아하는 뭔가 제대로 가고 있습니까
#FILE selection - we want to plot the most recent data file 

FILE = strftime('/data/%Y-%m-%d.txt', time(0)) # this is correct 

print "FILE is : " .FILE 

#set file path variable for awk :  (This is where my problem is) 

awk -v var="$FILE" '{print var}' 

awk '{print $0}' <<< "$FILE" 

+0

첫 번째 스크립트에서는'FILE' 대신' "$ FILE"'을 사용하십시오. 둘째, 마지막 줄에는'<<<'이 필요하지 않습니다. 'awk -v var = "$ FILE" '{print var}''은 불완전한 구문이고 인자로 파일을 필요로하므로 컴퓨터가 멈 춥니 다. 그냥'awk '{print $ 0}' "$ FILE"을 사용하십시오. – Aserre

+0

@Ploutox 그는'<<<'이 필요합니다. 변수의 데이터를 awk에 가져옵니다. – Jotne

+0

@Jotne 오, 나는'FILE'이 파일의 전체 내용이 아닌 경로를 저장했다고 생각했습니다. 그렇다면 사실 당신은 맞습니다. 편집 : 추가 읽은 후 OP 그냥'$ FILE' 가장 최근 파일의 경로를 저장 한 것 같습니다. 그런 다음 그는'<<<'을 제거해야합니다 (그렇지 않으면 그의 awk 명령이 단지 경로를 인쇄합니다). – Aserre

답변

2

하면 FILE가 사전에 감사합니다 .. 대부분 다른 게시물에서 함께 자갈길 파일의 경로를 포함하는 gnuplot 변수는 다음과 같이 할 수 있습니다.

FILE = 'input' 
plot '<awk ''1'' ' . FILE 

이것은 gnuplot 변수 FILE의 값을 awk 명령의 끝으로 연결합니다. 그 결과 awk "스크립트"는 awk '1' input (파일의 모든 행을 출력 함)입니다. awk로하고자하는 것이 무엇이든지 '1'으로 대체 할 수 있습니다. 그런데

, 당신의 awk 스크립트는이에 조금 단순화 할 수 있습니다

awk '{ y1 = y2; y2 = $14 } NR > 1 && (y2 - y1 >= 100 || y2 - y1 <= -100) { print "" } { print $1, $14 }' 

그것은 당신이, AWK에서 if를 사용할 필요가 각 블록 { }로 조건부 실행되는 것을 종종 (또는 경우 없음 조건이 지정되면 블록이 항상 실행됩니다). 레코드 구분 기호 (RS 변수)를 수정하지 않았다고 가정하면 print ""printf("\n")과 같습니다. gnuplot에 using 1:14을 지정하는 대신 print $1, $14을 사용하여 관심있는 열만 인쇄 할 수 있습니다.

그래서의 gnuplot에 replot 라인은 다음과 같습니다 물론

replot '<awk ''{ y1 = y2; y2 = $14 } NR > 1 && (y2 - y1 >= 100 || y2 - y1 <= -100) { print "" } { print $1, $14 }'' ' . FILE with linespoints 

,이 라인은 약간 긴지고 있습니다. 다음과 같이 약간 나누어 볼 수도 있습니다 :

awk_cmd = '{ y1 = y2; y2 = $14 } NR > 1 && (y2 - y1 >= 100 || y2 - y1 <= -100) { print "" } { print $1, $14 }' 
replot sprintf("<awk '%s' %s", awk_cmd, FILE) with linespoints 
+0

아직도이 문제로 고민하고 있습니다. 나는 FILE = strftime ('/ data/% Y- % m- % d.txt', 시간 (0)) (내 gnuplot 스크립트에서)을 설정했다.awk에이 변수 FILE을 얻으려면 다음과 같이하면된다 :'awk -v 'var = FILE'{print var} '..... 내 구문이 맞습니까? awk는 완고하게 변수를 읽고 그것을 사용하는 것을 거절합니다 ... 어떤 도움을 많이 주신 데 다시 .. – user3778424

+0

awk가 이름이 gnuplot 변수'FILE'에 저장되어있는 파일을 처리하게 하시겠습니까? 그렇다면, 내 대답은 어떻게하는지 알려줍니다. 그렇지 않다면 정확히 무엇을하려고합니까? 왜 awk 스크립트가 gnuplot 변수의 값을 출력하기를 원하겠습니까? 명확하게하기 위해 질문을 업데이트하십시오. 그건 그렇고, 당신은 여전히 ​​당신의 이전 질문에 대한 나의 대답을 받아들이지 않았습니다. 그렇게 해 주시면 감사하겠습니다. –

+0

안녕하세요 톰 - 예 초기 답변이 맞는 것 같습니다 -하지만 스크립트에서 작동하도록 코드를 가져올 수 없습니다. 조건부 플로팅을해야하기 때문에 awk를 사용하고 있습니다. 즉, 일부 데이터 요소는 조인해야하며 다른 값은 해당 값을 기반으로하지 않습니다. 다음은 코드 + 오류 메시지입니다. gnuplot> plot ' {y1 = y2; y2 = $ 12; if (NR> 1 && y2 - y1> = 100) printf ("\ n"); if (NR> 1 && y2 -y1 <= -100) printf ("\ n"); 인쇄}'. FI : sh : -c : 행 0 : 예기치 않은 EOF와 일치하는 것을 찾고 있습니다. sh : -c : 1 행 : 구문 오류 : 예기치 않은 파일 끝 경고 : 유효한 점이없는 데이터 파일 건너 뛰기 – user3778424