2010-08-03 3 views
4

나는, bash 쉘에서 한 번에 하나 개 이상의 명령을 통해 파이프에게 awk 명령의 출력을 시도하고 나는이 함께 올라오고있어 내 지식을 다음 해요 :셸 (bash)에서 파이프 라인에서 둘 이상의 명령을 어떻게 수행 할 수 있습니까?

awk '$13 ~ /type/ {print $15}' filename.txt | (wc -l || sort -u) 

을 나는 AWK의 결과를 원하는 명령을 계산하고 정렬하려면 어떻게해야합니까? & & 명령이 작동하지 않더라도 첫 번째 명령을 실행 한 다음 종료합니다. 나는 실패하고있는 배시에 대한 나의 지식이라고 생각한다.

미리 감사드립니다.

답변

5

한 줄로 두 개의 다른 명령으로 출력을 보내려면 프로세스 대체를 수행해야합니다.

이것을 시도 :

awk '$13 ~ /type/ {print $15}' filename.txt | tee >(wc -l >&2) | sort -u 

이 열려진에 라인 카운트와 표준 출력에 정렬 된 출력을 출력한다. stdout에 행 수가 필요하면 >&2을 그대로두면되지만 정렬 호출로 전달되어 출력 상단으로 정렬됩니다.

편집 : 추가 테스트를 기반으로하는 결과에 대한 수정 된 설명.

+0

작동하지 않습니다 :/ – OverLex

+0

@Lex : bash가'sh'로 호출되면 호환성 모드로 들어가고 프로세스 대체가 작동하지 않습니다. 명시 적으로 쉘을 'bash'라고 부르면 괜찮을 것입니다. – goldPseudo

+0

이 작동하지만 너무 깔끔하지 않아요 : awk '$ 13 ~/type/{print $ 15}'filename.txt | 티 test.txt | sort -u; 고양이 test.txt | wc -l – OverLex

0

더 큰 질문은 무엇이라고 생각합니까? 출력 결과는 무엇입니까?

awk '$13 ~ /type/ {print $15}' filename.txt > tempfile 
wc -l < tempfile 
sort -u < tempfile 
rm tempfile 
+0

내 출력이 awk 명령의 결과 일종의 결과 (줄 수)와 다른 줄 (또는 그 이상)이있는 두 줄 이상의 줄로 예상됩니다. awk 명령을 반복하거나 그 결과를 변수에 할당해야하기 때문에 한 줄에서이 작업을 수행 할 수 있는지 궁금합니다. – OverLex

+0

awk를 반복하지 않고 수행하는 방법을 보려면 내 편집을 참조하십시오. 일반적으로, 당신이하려는 일을하는 길을 발견하더라도 그것을하지 마십시오. 의도적으로 혼동스러운 코드를 작성해서는 안됩니다. – riwalk

+0

혼란스럽지 않았다. 단지 이런 식으로하는 것이 더 효율적이라고 생각했다. – OverLex

0

당신은 티와 함께에서는 mkfifo로 만든 명명 된 파이프를 사용하려면 : 당신이이 일을하려는 경우

는 다음 두 가지 작업을 수행. 예를 들어 다음과 같습니다. http://www.softpanorama.org/Tools/tee.shtml

4

이 경우에는 awk에서 계산을해야하며 파이프가 필요한 이유는 무엇입니까? 출력의 크기가 메모리에 맞게 너무 크지 않으면

awk '$13 ~ /type/ {print $15;c++}END{print c} ' filename.txt | sort -u 
+0

그건 그걸 해결하는 또 다른 방법입니다, 감사합니다! – OverLex

1

더 복잡하게하지 않는 당신은 성능상의 이유로 병렬로 작동하도록 wcsort 명령을하지 않아도, 여기에 상대적으로있어 간단한 해결책은 :

output=$(awk '$13 ~ /type/ {print $15}' filename.txt; echo a) 
printf "%s" "${output%a}" | sort -u 
printf "%s" "${output%a}" | wc -l 

하여 추가 a과 그 합병증은 경우에 awk 명령이 $() 구조가 제거 할 입력의 끝 부분에 약간의 빈 줄을 인쇄 할 수 있습니다. sort 또는 wc 중 먼저 표시 할 항목을 쉽게 선택할 수 있습니다.


여기에 (비교적 최근의 리눅스, * BSD 및 Solaris 포함) (화산재, bash는, KSH, zsh을, ...)하지만 /dev/fd이 시스템에있는 모든 POSIX 쉘에서 작동하는 방법입니다. Walter's similar construction using the simpler method available in bash, ksh93 and zsh과 마찬가지로 wc의 출력과 sort의 출력이 혼합되어있을 수 있습니다.

둘, 나는 생각하지 않는다 혼합 두 명령의 출력을하고 싶지 않아 메모리 에서 편안하게 적합하지 않는 중간 출력을 처리해야하는 경우

{ 
    awk '$13 ~ /type/ {print $15}' filename.txt | 
    tee /dev/fd3 | 
    wc -l 
} 3>&1 1>&3 | sort -u 
이것은 POSIX 셸에서 쉬운 방법이지만, ksh 또는 zsh 코 프로세서로 수행 할 수 있어야합니다.

관련 문제