2016-06-09 5 views
0

이것은 본질적으로 원하는 명령입니다. 쉘 명령을 사용하는 제 3 열에 특별한 것을 인쇄하려고한다는 것을 제외하고는 모두 작동합니다 (또는 더 많은 awk 명령을 추측하지만 나는 이것을 원래의 awk 문에 어떻게 넣을 지 모른다.) 내가 도움이 필요한 것은 print 명령문에서 $ 2와 ar [$ 4, $ 1] 사이의 유사 명령 대체이지만 나머지는 특수성을 위해 남겨 둡니다.awk 스크립트 내에서 awk 명령에 액세스해야하는 쉘 명령 사용

awk 'NR==FNR{ar[$3,$2]=$1+ar[$3,$2]; } 
    NR>FNR && ar[$4,$1] {print "hs"$1,$2,`awk '$1 == #$1 from outer awk command# file2 | tail -n 1 | awk '{print $3}'`, ar[$4,$1]}' file1 file2 

파일 1은

8 4520 7400 5 
7 10610 16789 15 
7 14647 16789 3 

감사합니다 - 당신과 같아야합니다

8 4520 5560 t11 
8 5560 6610 t12 
8 6610 7400 t13 
7 9350 10610 t11 
7 10610 11770 t12 
7 11770 14627 t13 
7 14627 16789 t14 

그리고 출력 모양을

5 8  t11 
15 7  t12 
3 7  t14 

파일 2처럼 보일 것입니다!

+2

당신은이 잘못에 대해 생각하고 있습니다. awk는 텍스트를 조작하는 도구입니다. 도구를 호출하는 환경이 아닙니다 (다른 awk 인스턴스 포함) - 이것이 쉘입니다. 우리가 당신을 도울 수 있도록 당신이 당신의 의견을 어떻게해야한다고 생각하는지 (**와는 대조적으로) 귀하의 의견을 당신의 의견에 어떻게 기술하고 싶은지 설명하십시오. –

+0

'ar [$ 4, $ 1]'이 샘플 출력의 마지막 열의 값을 반환하는 방법을 알지 못합니다. 그 문제에 관해서, 나는 입력에서 '5'와 '15'의 값을 생성 할 수있는 것을 보지 못한다. 따라서 EdM이 말했듯이 데이터 처리 방법에 대한 규칙을 볼 수 있습니다. 거의 확실하게 awk에서 필요한 결과를 얻거나 쉘 코드를 리팩토링하고 awk를 호출하는 방법을 사용할 수 있습니다. ** Q **를 업데이트하십시오. 행운을 빕니다. – shellter

+1

@shelter, '5'와 '15'는 _file1_에서 온 것입니다. – agc

답변

2

AWK, 비효율적 인 쉘 도구 코드 :

while read a b c ; do \ 
    echo -n "$b " ; \ 
    egrep "^$b " file2 | \ 
     grep -A 9999999 " $c" | \ 
     cut -d' ' -f2,3 | \ 
     sed '1{s/ .*//;t} 
      ${s/.* //;t};d' | \ 
     xargs echo -n ; \ 
    echo " $a" ; \ 
done < file1 | \ 
    column -t 

출력 :

8 4520 7400 5 
7 10610 16789 15 

주요 루프 입력이 파일 1 제어 무엇 파일 2 요구에 인쇄. $ A, B를 $$ C : FILE13 필드이므로 read 필요 3 개 변수를 갖는다. 출력 $ B를$ A을 사용하므로 두 변수 "무료"올 - 프리픽스 $ 및 접미사 B 메인 루프의 처음과 마지막 라인 (모두 echoS)를 $ a은 각 줄의 중간에있는 두 숫자입니다.

무엇 인 egrep 인쇄 $ B로 시작하지만, 그 라인의 우리는 $ 다 끝나는 일을 더한 그 후 라인을 원하는 파일 2의 모든 라인,

grep -A ... 인쇄. 중간의 두 열만 필요하므로 cut은 해당 열만 인쇄합니다. 이제 우리는 숫자의 두 열 블록을 가지며, sed 코드가 인쇄하는 왼쪽 위 모서리 나 오른쪽 아래 모서리 만 필요합니다 ...

모든 sed 코드는 실행될 때 자동으로 줄을 계산합니다. sed첫 번째 행에 도달하면 첫 번째 중괄호 세트 ('1{< 코드 >}')에있는 내용을 실행합니다.그것은 중괄호의 두 번째 세트에서 무엇, sed 실행, ('${< 코드 >}'를) 인 경우는, ($이 마지막 줄을 의미)의 마지막 라인의 경우 그 sed 검사에 실패합니다. 처음 또는 마지막 줄이 아니면 sed이 삭제합니다. 단지 cut -f 1 것처럼 작동 s/ .*// : 그 중괄호 내부

. 닫는 t 수단 'GOTO 라벨',하지만 '라벨'sed는 또 다른 라인을 읽고, 새로운주기가 시작이 없을 때 - t없이, 코드는 d를 실행하는 것, 및 인쇄 아무것도. 등 두 개의 필드, cut -f 2 같은 s/.* // 작품,

주요 while 루프의 각 패스 sed 인쇄 수 있지만, 각각은 자신의 라인에 있습니다. xargs echo -n으로 배관하면 $ b이 인쇄 된 동일한 줄에 두 번호가 표시됩니다.

+0

고마워, 내가 입력 한 파일 중 하나를 잘못 입력했다는 것을 깨달았지만, 행의 t11 대신에 3 열에서 t12가되어야한다. 7 출력에 10610 두 번째 열 두 번째 행 (그 부분이 전에 거기에)이 코드를 적절하게 조정하는 방법을 알고 있습니까? – Jacob

+0

또한 이것을 실행할 때 sed : 1 : "1 {s /. * // ; t}; $ {s /.* //; ... ": 예기치 않은 EOF (보류 중)), 그리고 sed에 익숙하지 않다. – Jacob

+0

전체 블록을 복사 한 다음 _all에 붙여 넣는다. 명령 줄, 그것은 작동합니다. – agc